سؤال

أعود إلى نتيجة 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)، لا توجد وسيلة لتبسيط هذا كثيرا. يمكنك بالتأكيد وضع الاستعلام البار في تعبير طاولة مشترك، ولكن كل شيء يصبح في الواقع أطول إذا فعلت ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top