SQL Server для пути XML
-
09-09-2019 - |
Вопрос
Я возвращаю результат запроса в формате 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, чтобы получить правильные результаты.
Я хотел бы убедиться, что нет лучшего способа сделать это.Коллега упомянул об использовании псевдонимов для удаления повторяющихся предложений, но не уверен, как это чего-нибудь даст.
Это необходимо или есть лучший способ?
Решение
Предполагая, что вы хотите вернуть только Foos, у которых есть Bar, и вам нужно сохранить узел Bar в XML (т.соединение не будет работать, поскольку оно сглаживает ваш XML), нет возможности существенно упростить это.Конечно, вы можете поместить запрос Bar в обычное табличное выражение, но если вы это сделаете, на самом деле все это станет длиннее.