2009-02-27 10 views
0

Ich gebe ein XML-Ergebnis für eine Abfrage zurück.SQL Server für Xml-Pfad

zwei Tabellen:

**Foo** 
FooId int 
FooName varchar(10) 

**Bar** 
BarId int 
FooId int (FK) 
BarName varchar(10) 

ich eine select-Anweisung wie:

SELECT 
    FooId, 
    FooName, 
    (
    SELECT 
     BarId, 
     FooId, 
     BarName 
    FROM 
     Bar 
    WHERE 
     Bar.FooId = Foo.FooId 
     AND Bar.BarName = 'SomeBar' 
    FOR XML PATH('Bar'), TYPE 
) 
FROM 
    Foo 
WHERE 
    Foo.FooName = 'SomeFoo' 
    AND Foo.FooId IN 
    (
    SELECT 
     Bar.FooId 
    FROM 
     Bar 
    WHERE 
     Bar.BarName = 'SomeBar' 
) 
FOR XML PATH('Foo'), TYPE 

Dies funktioniert, wie ich es und gibt die richtigen Ergebnisse zu erwarten. Ich erkannte, während ich es entwickelte, musste ich die Filterklauseln sowohl in der Unterauswahl als auch in den geschachtelten Auswahlen in der Where-Klausel duplizieren, um die korrekten Ergebnisse zu erhalten.

Ich möchte sicherstellen, dass es keinen besseren Weg gibt, dies zu tun. Ein Mitarbeiter erwähnte die Verwendung von Aliasen, um die doppelten Klauseln zu entfernen, bin mir aber nicht sicher, wie das alles erreichen würde.

Ist das notwendig, oder gibt es einen besseren Weg?

Antwort

2

Angenommen, Sie möchten nur Foos zurückgeben, die einen Balken haben und den Bar-Knoten im XML beibehalten müssen (dh ein Join funktioniert nicht, da er Ihr XML flacht), gibt es keine Möglichkeit zur Vereinfachung das ist viel. Sie können die Bar-Abfrage sicherlich in einen allgemeinen Tabellenausdruck einfügen, aber das Ganze wird tatsächlich länger, wenn Sie das tun.