Tsql使用和条件从相关表中选择
我有两个相关的表: 表1Tsql使用和条件从相关表中选择,sql,tsql,Sql,Tsql,我有两个相关的表: 表1 Id ----- 1 2 3 表2 Id Feature -------------- 1 Car 1 Moto 1 Camper 2 Moto 2 Scooter 3 Apple 我想选择同时具有“Car”和“Moto”的ID。 因此,在本例中,我只想得到Id=1。此选择将两个左外连接到表2(一个基于'Car',另一个基于'Moto'),并确保每个连接都返回一个结果。DISTINCT确保每个ID只
Id
-----
1
2
3
表2
Id Feature
--------------
1 Car
1 Moto
1 Camper
2 Moto
2 Scooter
3 Apple
我想选择同时具有“Car”和“Moto”的ID。
因此,在本例中,我只想得到Id=1。此选择将两个
左外连接到表2
(一个基于'Car',另一个基于'Moto'),并确保每个连接都返回一个结果。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
编辑:删除了表1的连接,因为它确实不需要。此:
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
哪个查询更有效取决于两个表中有多少记录以及有多少匹配项。使用INTERSECT
操作符:
select id from table2 where feature = 'Car'
intersect
select id from table2 where feature = 'Moto'
我想你的意思是第一个选择中的表2
。这个intersect操作符太棒了!谢谢德里克用INTERSECT
的回答可能比这个更快。