[英]a complex sql query with outer join
有两张桌子
------------------------------
id | Name
------------------------------
1 | Alpha
-----------------------------
2 | Beta
-----------------------------
3 | Gamma
-----------------------------
4 | Delta
-----------------------------
和另一个具有表a外键的表b
b
-----------------------------
id | a_id | Film
-----------------------------
1 | 1 | Bladerunner
-----------------------------
2 | 1 | Star Wars
-----------------------------
3 | 3 | Superman
-----------------------------
4 | 4 | Rollerball
-----------------------------
使用外部联接编写SQL查询,以从表“ a”中获取所有没有以“ S”开头的电影的名称。
查询结果应为:
Beta
--------
Delta
使用not exists
相关子查询
SELECT *
FROM tablea a
LEFT JOIN tableb b
ON a.id = b.a_id
WHERE NOT EXISTS (SELECT 1
FROM tableb b1
WHERE b.a_id = b1.a_id
AND film LIKE 'S%')
或者您可以使用以下查询来避免子查询
SELECT NAME,
Sum(CASE
WHEN film LIKE 'S%' THEN 1
ELSE 0
END)
FROM t1 a
LEFT JOIN t2 b
ON a.id = b.a_id
GROUP BY NAME
HAVING Sum(CASE
WHEN film LIKE 'S%' THEN 1
ELSE 0
END) = 0
输出:
name
Delta
Beta
SELECT a.NAME
FROM a
LEFT JOIN b
ON a.id = b.a_id
WHERE a.NAME NOT IN (SELECT a.NAME
FROM a
LEFT JOIN b
ON a.id = b.a_id
WHERE b.film LIKE 's%')
GROUP BY a.NAME
输出
贝塔
三角洲
根据他没有提到的OP问题,只是在问题中给出了输出部分……他想要表a的所有名称,其中电影名称不以表b的字母S开头。 以上查询以最标准的方式完全满足了OP的需求。
OP只是在问题中提到了连接,但他没有提到他也想要那些在a_id中表b中不存在的id名称,即输出部分beta。
使用子串并加入
select a.name from t1 a left join
t2 b on a.id=b.a_id
where a.id not in ( select b.a_id from t2 b
where
upper(substring(b.Film,1,1)) like '%S%' and b.a_id is not null
)
输出
name
Delta
Beta
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.