首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单SQL分组依据

问简单SQL分组依据
EN

Stack Overflow用户
提问于 2011-12-02 05:08:04
回答 3查看 70关注 0票数 2

我有一个名为foobar的表,其中包含列name和location。我想使用SQL来获取所有去过纽约但没有去过旧金山的人的名字。

到目前为止,有:

代码语言:javascript
复制
  select name 
    from foobar 
   where location = "New York" and location != "San Francisco" 
group by name
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-02 05:10:21

代码语言:javascript
复制
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来完成此操作:

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2011-12-02 05:10:09

代码语言:javascript
复制
select name 
from foobar 
where location = "New York"
and name not in (select name 
from foobar 
where location = "San Francisco")
票数 5
EN

Stack Overflow用户

发布于 2014-03-25 13:49:35

在这种情况下,SQL“不存在”查询就派上了用场。看一下下面的查询:

代码语言:javascript
复制
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

代码语言:javascript
复制
  select f1.name
  from foobar as f1
  where f1.location = "New York"

这个简单的select查询将显示所有访问过纽约的姓名。就这么简单!

第2部分:假设这是query2

代码语言:javascript
复制
  select f2.name
  from foobar as f2
  where f2.location = "San Francisco"

这是另一个简单的select查询,它将显示所有访问过旧金山的姓名。

现在我们需要实现的是,我们想要那些去过纽约的人的名字,减去去过旧金山的人的名字。现在可能会发生这样的情况:一个人同时去过纽约和旧金山,因此我们正在剔除这些人。我们只想要纽约的游客。因此,我们实际上从query1中丢弃了query2的结果,组合如下:

代码语言:javascript
复制
  query1
  and not exists
  (query2 + where f1.name = f2.name)

或,

代码语言:javascript
复制
 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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8348320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档