я следующие таблицы:SQL Server EXISTS запрос для определения отношения
Foo
FooId INT PRIMARY KEY
FooRelationship
FooRelationshipId INT PRIMARY KEY IDENTITY
FooParentId INT FK
FooChildId INT FK
Как бы написать запрос, который будет возвращать каждый id из Foo и статус записи (будь то родитель, ребенок или нет).
Правила:
- Foo будет только один из родителей или ребенка, или ни.
- Foo может быть родителем нескольких разных foos.
- Foo не может быть ребенком более одного foo.
Я первоначально написал этот вопрос:
SELECT
FooId,
CASE
WHEN Parent.FooRelationshipId IS NOT NULL THEN 'Parent'
WHEN Child.FooRelationshipId IS NOT NULL THEN 'Child'
ELSE 'Neither'
END
FROM Foo F
LEFT JOIN FooRelationship Parent ON F.FooId = Parent.FooParentId
LEFT JOIN FooRelationship Child ON F.Fooid = Child.FooParentId
Это нарушается, потому что если Foo является родителем два других Фооса то возвращает этот идентификатор дважды.
Как я могу переписать это, чтобы либо не использовать соединение, либо использовать EXISTS или что-то еще.
Есть ли лучший способ написать этот запрос. Меня волнует производительность, потому что в этой таблице довольно много строк, и у них около 30-40 столбцов? – Dismissile
@ Dismissile Мне нужна дополнительная информация, но одним из вариантов будет использование вашего примерного (узкого) запроса в качестве подзапроса и JOIN. Затем вы можете получить информацию «FooID, Relationship», не получая остальную часть строк, и «JOIN». Я отправлю пример. – JNK
Спасибо, это очень помогло. – Dismissile