سؤال
أعود إلى نتيجة XML لاستعلام.
إعطاء طاولتين:
**Foo**
FooId int
FooName varchar(10)
**Bar**
BarId int
FooId int (FK)
BarName varchar(10)
أقوم بإنشاء عبارة مختارة مثل:
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
يعمل هذا كما أتوقعه ويعيد النتائج الصحيحة. أدركت أثناء تطويره أحتاج إلى تكرار بنود التصفية في كل من Sub Select والتحديد المتداخلة في جملة WHERE من أجل الحصول على النتائج الصحيحة.
أود التأكد من عدم وجود طريقة أفضل للقيام بذلك. ذكر زميل العمل باستخدام الأسماء المستعارة لإزالة البنود المكررة ولكن لست متأكدا من كيفية تحقيق أي شيء.
هل هذا ضروري، أم أن هناك طريقة أفضل؟
المحلول
على افتراض أنك تريد فقط إرجاع FOOS الذي يحتوي على شريط، وأنك تحتاج إلى الحفاظ على عقدة الشريط في XML (أي لن يعمل الانضمام، لأنه يسطح XML)، لا توجد وسيلة لتبسيط هذا كثيرا. يمكنك بالتأكيد وضع الاستعلام البار في تعبير طاولة مشترك، ولكن كل شيء يصبح في الواقع أطول إذا فعلت ذلك.
لا تنتمي إلى StackOverflow