带有where子句的SQL join语句

带有where子句的SQL join语句,sql,join,left-join,inner-join,Sql,Join,Left Join,Inner Join,我有一个问题,因为我正试图通过。我已经试了好几个小时了,如果有人能给我们指出正确的方向,那就太好了 这是德语,所以我将用英语翻译: 我们只对(d)部分有问题 (d) 写一个SQL语句,给出餐厅的名称和不点沙拉的餐厅的Ort(地点) 预期结果将是: 黑手党:哥廷根 威尼斯:卡塞尔 您可以这样尝试: SELECT name,ort FROM kunde WHERE name NOT IN (SELECT DISTINCT(pizzeria) FROM Liefervertrag WHERE pr

我有一个问题,因为我正试图通过。我已经试了好几个小时了,如果有人能给我们指出正确的方向,那就太好了

这是德语,所以我将用英语翻译:

我们只对(d)部分有问题

(d) 写一个SQL语句,给出餐厅的名称和不点沙拉的餐厅的Ort(地点)

预期结果将是:

黑手党:哥廷根
威尼斯:卡塞尔


您可以这样尝试:

  SELECT name,ort FROM kunde WHERE name NOT IN (SELECT DISTINCT(pizzeria) FROM Liefervertrag WHERE product='salat')

您可以这样尝试:

  SELECT name,ort FROM kunde WHERE name NOT IN (SELECT DISTINCT(pizzeria) FROM Liefervertrag WHERE product='salat')

它不适用于LolCoder的答案,但请记住,当子查询具有空值时,要小心NOT IN

这是另一种不同主题的方法。虽然它确实使用了内部连接,但它并不是很奇特。你可能会在野外找到它们

我的偏好是第一个。我通常也会明确表示“else null”,尽管从技术上讲这不是必需的

-- A
SELECT name, min(ort) as ort
FROM kunde as k INNER JOIN Liefervertrag as l on l.pizzeria = k.name
GROUP by name
HAVING count(case when l.product = 'salat' then 1 else null end) = 0

-- B
SELECT name, min(ort) as ort
FROM kunde as k INNER JOIN Liefervertrag as l on l.pizzeria = k.name
GROUP by name
HAVING sum(case when l.product = 'salat' then 1 else 0 end) = 0

-- C
SELECT name, ort
FROM kunde as k INNER JOIN Liefervertrag as l on l.pizzeria = k.name
GROUP by name, ort
HAVING count(case when l.product = 'salat' then 1 else null end) = 0

-- D
SELECT name, ort
FROM kunde as k INNER JOIN Liefervertrag as l on l.pizzeria = k.name
GROUP by name, ort
HAVING sum(case when l.product = 'salat' then 1 else 0 end) = 0

它不适用于LolCoder的答案,但请记住,当子查询具有空值时,要小心NOT IN

这是另一种不同主题的方法。虽然它确实使用了内部连接,但它并不是很奇特。你可能会在野外找到它们

我的偏好是第一个。我通常也会明确表示“else null”,尽管从技术上讲这不是必需的

-- A
SELECT name, min(ort) as ort
FROM kunde as k INNER JOIN Liefervertrag as l on l.pizzeria = k.name
GROUP by name
HAVING count(case when l.product = 'salat' then 1 else null end) = 0

-- B
SELECT name, min(ort) as ort
FROM kunde as k INNER JOIN Liefervertrag as l on l.pizzeria = k.name
GROUP by name
HAVING sum(case when l.product = 'salat' then 1 else 0 end) = 0

-- C
SELECT name, ort
FROM kunde as k INNER JOIN Liefervertrag as l on l.pizzeria = k.name
GROUP by name, ort
HAVING count(case when l.product = 'salat' then 1 else null end) = 0

-- D
SELECT name, ort
FROM kunde as k INNER JOIN Liefervertrag as l on l.pizzeria = k.name
GROUP by name, ort
HAVING sum(case when l.product = 'salat' then 1 else 0 end) = 0

是的,它确实有帮助,我将接受它,我只是有另一个问题:这也可以通过一些奇特的join语句来实现吗?我的意思是你的解决方案是正确的,但我只是想知道是的,你可以通过使用JOIN来实现,但这在这个场景中是不相关的……你可以通过检查产品中的条件来加入kunde和Liefervertrag……尝试使用此查询来加入:选择a.name,a、 来自konde a的ort加入a.name=b.pizzeria上的Liefervertrag b,b.prodokt不在(“沙拉”)中是的,它确实有帮助,我将接受它,我只是有另一个问题:这也可以通过一些奇特的加入声明来实现吗?我的意思是你的解决方案是正确的,但我只是想知道是的,你可以通过使用JOIN来实现,但这在这个场景中是不相关的……你可以通过检查产品中的条件来加入kunde和Liefervertrag……尝试使用此查询来加入:选择a.name,a、 来自konde a的ort加入a.name=b.pizzeria上的Liefervertrag b,其中b.prodokt不在(“沙拉”)中,但我似乎无法实现这一点。我不断地得到一个错误:“k.product not found in Having子句”我检查了所有的拼写和拼写错误…我找到了原因。。。这里有一个轻微的打字错误。。。having子句中的“k.product”应该是“l.product”,但除此之外,它工作得很好!我(带着所有应有的尊重和感激:P)编辑了你的回答谢谢。因为我不懂德语,所以我做了更多的前后翻转,但这仍然是我自己的愚蠢错误。但我似乎没有让这个工作。我不断地得到一个错误:“k.product not found in Having子句”我检查了所有的拼写和拼写错误…我找到了原因。。。这里有一个轻微的打字错误。。。having子句中的“k.product”应该是“l.product”,但除此之外,它工作得很好!我(带着所有应有的尊重和感激:P)编辑了你的回答谢谢。因为我不懂德语,所以我做了更多的前后翻转,但这仍然是我自己的愚蠢错误。