Вопрос

Я возвращаю результат запроса в формате 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 в обычное табличное выражение, но если вы это сделаете, на самом деле все это станет длиннее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top