Eindeutige Datensaetze aus Tabelle mit NTEXT-Spalte abfragen

24/08/2007 - 15:12 von Christoph Schneegans | Report spam
Hallo allerseits!

Ich habe eine Tabelle in SQL Server 2000 mit einer INT- und einer NTEXT-Spalte:

id data
== 1 Lorem
1 ipsum
2 dolor
2 sit
3 amet

Ich suche eine Abfrage, die mir eindeutige Werte in der Spalte "id" liefert.
Welcher Wert aus der Spalte "data" genommen wird, ist völlig egal. Das Resultset
darf also bspw.

id data
== 1 Lorem
2 dolor
3 amet

oder auch

id data
== 1 ipsum
2 sit
3 amet

sein. Der triviale Ansatz

select
id,
max(data)
from table1
group by id;

schlàgt natürlich fehl, weil Aggregatfunktionen nicht auf NTEXT-Felder angewendet
werden können. Mit einem CAST(data AS NVARCHAR(4000)) ginge es, aber der Feldinhalt
ist nicht notwendigerweise auf 4.000 Zeichen limitiert.

Ich hatte also gehofft, das Problem mit TOP 1 in einer Unterabfrage elegant
erschlagen zu können:

select
t1.id,
(select top 1 data from table1 as t2 where t1.id = t2.id)
from table1 as t1
group by t1.id;

Zu meiner Überraschung beschwert sich SQL Server auch hier:

"The text, ntext, and image data types are invalid in this subquery or
aggregate expression."

Wieso weigert sich SQL Server, diese Abfrage auszuführen? Und welche
Alternativen gibt es noch?

<http://schneegans.de/xp/> · text/html in application/xhtml+xml umwandeln
 

Lesen sie die antworten

#1 Frank Kalis
24/08/2007 - 15:56 | Warnen spam
"Christoph Schneegans" wrote:

Ich habe eine Tabelle in SQL Server 2000 mit einer INT- und einer NTEXT-Spalte:

id data
==> 1 Lorem
1 ipsum
2 dolor
2 sit
3 amet

Ich suche eine Abfrage, die mir eindeutige Werte in der Spalte "id" liefert.
Welcher Wert aus der Spalte "data" genommen wird, ist völlig egal. Das Resultset
darf also bspw.

id data
==> 1 Lorem
2 dolor
3 amet

oder auch

id data
==> 1 ipsum
2 sit
3 amet

sein. Der triviale Ansatz

select
id,
max(data)
from table1
group by id;

schlàgt natürlich fehl, weil Aggregatfunktionen nicht auf NTEXT-Felder angewendet
werden können. Mit einem CAST(data AS NVARCHAR(4000)) ginge es, aber der Feldinhalt
ist nicht notwendigerweise auf 4.000 Zeichen limitiert.

Ich hatte also gehofft, das Problem mit TOP 1 in einer Unterabfrage elegant
erschlagen zu können:

select
t1.id,
(select top 1 data from table1 as t2 where t1.id = t2.id)
from table1 as t1
group by t1.id;

Zu meiner Überraschung beschwert sich SQL Server auch hier:

"The text, ntext, and image data types are invalid in this subquery or
aggregate expression."

Wieso weigert sich SQL Server, diese Abfrage auszuführen? Und welche
Alternativen gibt es noch?




Nichts für ungut, aber in solchen Momenten zahlt sich ein durchdachtes
Design mit einem PRIMARY KEY eindeutig aus. :-)

Lies Dir mal den Thread "Durchnummerieren einer Spalte" von heute hier
durch. Du kannst entweder die Daten in eine temp Tabelle mit einer IDENTITY
Spalten laden und dann für die temp Tabelle das Statement aufsetzen oder Du
"generierst" diesen eindeutigen Zàhler pro Gruppe selber und filterst dann in
einer WHERE Klausel auf diesen Wert. So etwas in der Richtung wie dies hier:
http://www.insidesql.de/forum/func,...9/catid,9/
Frank Kalis
Microsoft SQL Server MVP
Webmaster: http://www.insidesql.de

Ähnliche fragen