Начальная точка является объединение Знает таблицу:
SELECT personA_id ,
personB_id
FROM @k k
UNION
SELECT personB_id ,
personA_id
FROM @k k
Потому что вы получите неправильный результат, если вы просто проверить с одной стороны стола знает.
DECLARE @p TABLE
(
id INT ,
name NVARCHAR(MAX) ,
age INT
)
DECLARE @k TABLE
(
personA_id INT ,
personB_id INT
)
INSERT INTO @p
VALUES (1, 'a', 10),
(2, 'b', 14),
(3, 'c', 30),
(6, 'f', 35),
(7, 'g', 45)
INSERT INTO @k
VALUES (1, 2),
(1, 3),
(2, 3),
(7, 6)
SELECT t.personA_id ,
t.name
FROM (SELECT personA_id ,
name ,
paage - pbage AS diff
FROM (SELECT personA_id ,
personB_id ,
pa.age paage ,
pb.age pbage ,
pa.name
FROM @k k
JOIN @p pa ON pa.id = k.personA_id
JOIN @p pb ON pb.id = k.personB_id
UNION
SELECT personB_id ,
personA_id ,
pb.age pbage ,
pa.age paage ,
pb.name
FROM @k k
JOIN @p pa ON pa.id = k.personA_id
JOIN @p pb ON pb.id = k.personB_id
) k
) t
GROUP BY t.personA_id ,
t.name
HAVING (MIN(diff) > 5)
Выход:
personA_id name
3 c
7 g
Если вы присоединитесь прямо на столе Knows, то вы получите:
SELECT t.personA_id ,
t.name
FROM (SELECT personA_id ,
name ,
paage - pbage AS diff
FROM (SELECT personA_id ,
personB_id ,
pa.age paage ,
pb.age pbage ,
pa.name
FROM @k k
JOIN @p pa ON pa.id = k.personA_id
JOIN @p pb ON pb.id = k.personB_id
) k
) t
GROUP BY t.personA_id ,
t.name
HAVING (MIN(diff) > 5)
Выход:
personA_id name
7 g
Как это не работает? Какие СУБД вы используете? –
, то почему вы имеете в виду, что «это не работает»? – Lamak
Я имею в виду, что он не возвращает то, что предполагается. Правильно ли выглядит запрос на то, что я хочу вернуть? – eeKat88