SQL Server For Xml Path - PullRequest
       12

SQL Server For Xml Path

0 голосов
/ 27 февраля 2009

Я возвращаю результат 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  

Это работает так, как я ожидаю, и возвращает правильные результаты. При разработке я понял, что для получения правильных результатов мне нужно было продублировать условия фильтрации как во вложенном, так и во вложенном выборе в предложении where.

Я бы хотел убедиться, что нет лучшего способа сделать это. Коллега упомянул об использовании псевдонимов для удаления дублирующих пунктов, но не уверен, как это могло бы чего-то добиться.

Это необходимо, или есть лучший способ?

1 Ответ

2 голосов
/ 27 февраля 2009

Предполагая, что вы хотите только вернуть Foos, у которых есть Bar, и что вам нужно сохранить узел Bar в XML (т. Е. Объединение не будет работать, так как оно выравнивает ваш XML), нет способа упростить это. очень. Конечно, вы можете поместить запрос Bar в общее табличное выражение, но на самом деле все становится длиннее, если вы это сделаете.

...