我有两张桌子: -
表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
上编写一个连接表M
和m.T_ID = T.ID
的查询,但如果任何 {{则不应返回T.ID
1}}映射到它的类型为M
,即上面的数据集应该返回值S
而不是T.ID = 2,3
,因为映射到它的1,4
类型为M
一种方法是编写内部查询。类似的东西: -
S
但内部查询可能非常昂贵,因为我的表M有数百万行。有一个更好的方法吗 ?
答案 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。