2011-11-16 54 views
4

选择我有两个相关的表:TSQL从相关表格和条件

表1

Id 
----- 
1 
2 
3 

表2

Id  Feature 
-------------- 
1  Car 
1  Moto 
1  Camper 
2  Moto 
2  Scooter 
3  Apple 

我要选择具有,例如IDS,既'汽车'和'摩托'。 在例子中我想只有编号= 1

回答

2

使用INTERSECT操作:

select id from table2 where feature = 'Car' 
intersect 
select id from table2 where feature = 'Moto' 
+0

我认为你的意思是'table2'在第一个'SELECT'中。 – ean5533

+0

奇妙的这个相交运算符!谢谢! –

0

该选择做两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,因为它确实是没有必要的。

+0

使用'INTERSECT'可能比这更快的德里克的答案。 – ean5533

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 

哪个查询更有效取决于你有多少条记录有两个表中有多少匹配有。