我有一个名为foobar
的表,列name
和location
。我想用SQL来获取前往纽约但未前往旧金山的所有人的姓名。
到目前为止:
select name
from foobar
where location = "New York" and location != "San Francisco"
group by name
答案 0 :(得分:7)
SELECT f.name
FROM foobar f
WHERE f.location = 'New York'
AND NOT EXISTS(SELECT NULL
FROM foobar f2
WHERE f2.name = f.name
AND f2.location = 'San Francisco')
您也可以使用LEFT JOIN执行此操作:
SELECT f.name
FROM foobar f
LEFT JOIN foobar f2
ON f.name = f2.name
AND f2.location = 'San Francisco'
WHERE f.location = 'New York'
AND f2.name IS NULL
答案 1 :(得分:5)
select name
from foobar
where location = "New York"
and name not in (select name
from foobar
where location = "San Francisco")
答案 2 :(得分:0)
在这种情况下,SQL"不存在"查询派上用场。看看以下查询:
select f1.name
from foobar as f1
where f1.location = "New York"
and not exists
(select f2.name
from foobar as f2
where f1.name= f2.name
and location = "San Francisco")
为了更好地理解,让我们将此查询分解为更小的部分。
部分-1: 让我们说,这是query1
select f1.name
from foobar as f1
where f1.location = "New York"
这个简单的选择查询将显示访问纽约的所有名称。就这么简单!
部分-2: 让我们说,这是query2
select f2.name
from foobar as f2
where f2.location = "San Francisco"
这是另一个简单的选择查询,它将显示访问过旧金山的所有名称。
现在我们需要实现的是,我们想要访问纽约的人的名字,减去访问过旧金山的名字。现在,一个人可能已经访问了纽约和旧金山,因此我们正在消除那些人。我们只想要纽约的访客。所以我们实际上是从query1中丢弃query2的结果,结合如下:
query1
and not exists
(query2 + where f1.name = f2.name)
,或者
select f1.name
from foobar as f1
where f1.location = "New York"
and not exists
(select f2.name
from foobar as f2
where f1.name = f2.name
and f2.location = "San Francisco")