Tsql使用和条件从相关表中选择

Tsql使用和条件从相关表中选择,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只

我有两个相关的表:

表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只获得一次

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
的回答可能比这个更快。