只有在不包含特定值的情况下才返回结果?

时间:2016-05-12 17:20:09

标签: mysql

我有两张桌子: -

T

 ID | val 
  1 | abcd 
  2 | 1234
  3 | asd 
  4 | lkj 

另一张表M

ID | T_ID | Type 
 1 | 1    |  I 
 2 | 1    |  S
 3 | 2    |  I
 4 | 2    |  I
 5 | 3    |  I
 6 | 4    |  S

我想在T上编写一个连接表Mm.T_ID = T.ID的查询,但如果任何 {{则不应返回T.ID 1}}映射到它的类型为M,即上面的数据集应该返回值S而不是T.ID = 2,3,因为映射到它的1,4类型为M

一种方法是编写内部查询。类似的东西: -

S

但内部查询可能非常昂贵,因为我的表M有数百万行。有一个更好的方法吗 ?

3 个答案:

答案 0 :(得分:2)

使用条件COUNT

SELECT T.id 
FROM   table1 T 
JOIN   table2 M 
  ON   M.t_id = T.id 
GROUP BY T.id 
HAVING COUNT( CASE WHEN M.Type = 'S' THEN 1 END ) = 0

意味着你在该组中没有'S'

答案 1 :(得分:1)

不是最漂亮但似乎有效

select T.ID 
from Table1 T 
left join Table2 M on M.T_ID = T.ID
group by T.Id
having sum(case when M.Type = 'S' then 1 else 0 end) = 0

您应该检查执行计划中是否实际上更便宜。

答案 2 :(得分:-2)

你应该看看LEFT JOIN而不是INNER JOIN。