有两个表 一个
------------------------------
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
答案 0 :(得分:3)
使用关联的子查询与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
答案 1 :(得分:0)
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
输出
测试版
Delta
根据他没有提到的OP问题,只是在问题中给出了输出部分...他希望表a的所有名称中电影名称不以表b中的字母S开头。以上查询以最标准的方式完全满足了OP的需求。
OP刚刚提到了问题中的联接,但他没有提到他想要那些id也不存在于表b中a_id的id名称,即输出部分beta。
答案 2 :(得分:-1)
使用子字符串并加入
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