2012-07-07 82 views
0

我有这个问题,我试图通过。我一直在努力这么做几个小时,如果有人能指引我们走向正确的方向,那将是非常棒的。SQL加入声明与where子句

这是德国人,所以我打算把它的英文翻译:

我们只有问题(d)部分

(d)编写SQL语句,让餐厅和口服补液疗法名(地点)的餐厅,不订购任何萨拉特。

预期的结果将是:

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

enter image description here

回答

1

你可以尝试这样的:

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

现在,这似乎很容易......谢谢你这么多 – 2012-07-07 18:20:59

+1

如果回答可以帮助你,不要忘了接受的答案.... – 2012-07-07 18:22:25

+0

是它没有帮助,我会接受它,我还有另外一个问题:这也可以通过一些奇特的加入声明来完成吗?我的意思是你的解决方案是正确的,但我只是想知道 – 2012-07-07 18:24:36

3

不适到LolCoder的答案,但是当子查询有空时请记住NOT NOT要小心。

这是另一种主题变化的方法。即使它使用内部连接,也不是很花哨。你可能会发现他们都在野外。

我的首选是第一个。即使没有技术上的必要,我通常也会对“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 
+0

谢谢非常多,这也非常有帮助! – 2012-07-07 23:49:32

+0

但我似乎没有得到这个工作。我继续得到一个错误:“在having clause中找不到k.product”我检查了所有的拼写和拼写错误... – 2012-07-07 23:55:15

+0

我发现了为什么...这里有一个轻微的错字...“k.product “在子句中应该是”l.product“,否则它工作得很好! – 2012-07-07 23:58:09