选择我有两个相关的表:TSQL从相关表格和条件
表1
Id
-----
1
2
3
表2
Id Feature
--------------
1 Car
1 Moto
1 Camper
2 Moto
2 Scooter
3 Apple
我要选择具有,例如IDS,既'汽车'和'摩托'。 在例子中我想只有编号= 1
选择我有两个相关的表:TSQL从相关表格和条件
表1
Id
-----
1
2
3
表2
Id Feature
--------------
1 Car
1 Moto
1 Camper
2 Moto
2 Scooter
3 Apple
我要选择具有,例如IDS,既'汽车'和'摩托'。 在例子中我想只有编号= 1
使用INTERSECT
操作:
select id from table2 where feature = 'Car'
intersect
select id from table2 where feature = 'Moto'
该选择做两LEFT OUTER JOIN
s到table2
(一个基于“汽车”,并根据“摩托”的除外),并确保每一个JOIN
返回结果。 DISTINCT
确保您只获取一次每个ID。
SELECT DISTINCT t1.id
FROM table2 t2
LEFT OUTER JOIN table2 t2_2 ON t2.id = t2_2.id AND t2_2.feature = 'Moto'
WHERE t2.feature = 'Car'
AND t2_2.id IS NOT NULL
编辑:删除加入到Table 1,因为它确实是没有必要的。
使用'INTERSECT'可能比这更快的德里克的答案。 – ean5533
此:
WITH features AS
(
SELECT feature
FROM (
VALUES
('Car'),
('Moto')
) q (feature)
)
SELECT *
FROM table1 t1
WHERE NOT EXISTS
(
SELECT feature
FROM features
EXCEPT
SELECT feature
FROM table2 t2
WHERE t2.id = t1.id
)
或本:
SELECT *
FROM table t1
WHERE (
SELECT COUNT(*)
FROM table2 t2
WHERE t2.id = t1.id
AND t2.feature IN ('Car', 'Moto')
) = 2
哪个查询更有效取决于你有多少条记录有两个表中有多少匹配有。
我认为你的意思是'table2'在第一个'SELECT'中。 – ean5533
奇妙的这个相交运算符!谢谢! –