【问题标题】:SQL: How do you select only groups that do not contain a certain value?SQL:如何只选择不包含特定值的组?
【发布时间】:2012-03-10 10:42:17
【问题描述】:

假设我有一张桌子:

Restaurant locations: 

RESTAURANT_NO | RESTAURANT_LOCATION
-----------------------------------
1             |            City A
1             |            City B
2             |            City A
2             |            City B
2             |            City C
3             |            City C
4             |            City A
4             |            City B

我怎样才能将它们组合在一起并且只选择 RESTAURANT_NO 在 C 市没有位置?

使用这个例子,我想返回:

 RESTAURANT_NO
 -------------
 1
 4

因为 RESTAURANT_NO 2 和 3 都在 C 市有位置。

我不知道如何将 RESTAURANT_NO 组合在一起,同时还尝试仅选择满足此要求的组。

编辑:我得到了这个工作。

但是,我仍然无法弄清楚最后一件事。 下表列出了人员的 ID 号以及他们工作过的城市:

PERSON_NO | CITY_NAME
---------------------
1         |    City A
2         |    City B
3         |    City A
3         |    City B
3         |    City C
4         |    City A
4         |    City B
4         |    City C

我怎样才能得到所有人的 PERSON_NO 谁住在 A、B 和 C 这三个城市?

我想回来

PERSON_NO
---------
3
4

再次感谢。我没有太多的 SQL 经验,所以我不知道该怎么做。

【问题讨论】:

    标签: sql group-by


    【解决方案1】:

    一种方式:

    SELECT RESTAURANT_NO FROM restaurant WHERE RESTAURANT_NO NOT IN
    (SELECT RESTAURANT_NO FROM restaurant WHERE RESTAURANT_LOCATION = 'City C')
    

    【讨论】:

    • 我已经用这个查询测试了我的数据库,它似乎工作。谢谢。
    • 我已经在我的数据库中测试了上面的查询,它工作正常,谢谢
    • 如果您出于自己的目的使用此(好!)答案,请记住,如果子查询返回 NULL,您将不会得到任何结果,即在这种情况下为 RESTAURANT_NO)。在这个特定示例中它永远不会为 NULL,但对于更通用的用途,您可能需要插入一个 IS NOT NULL 检查。 :-)
    • @Jonas 你如何在上面的语句中加入 IS NOT NULL 检查?
    • @AlGuy 我知道你没有问我,但这里有一个方法:SELECT RESTAURANT_NO FROM restaurant WHERE (RESTAURANT_NO NOT IN (SELECT RESTAURANT_NO FROM restaurant WHERE RESTAURANT_LOCATION = 'City C') OR (RESTAURANT_NO IS NULL AND NOT EXISTS (SELECT 0 FROM restaurant WHERE RESTAURANT_NO IS NULL AND RESTAURANT_LOCATION = 'City C'))
    【解决方案2】:
    SELECT DISTINCT
          Restaurant_no
    FROM 
          TableX t
    WHERE 
          NOT EXISTS
          ( SELECT *
            FROM TableX c
            WHERE c.Restaurant_no = t.Restaurant_no
              AND c.Restaurant_location = 'City C'
          )
    

    【讨论】:

      【解决方案3】:

      使用DISTINCT

      试试这个:

      SELECT DISTINCT t.Restaurant_No
      FROM Restaurant t
      WHERE t.Restaurant_No NOT IN
             (SELECT s.Restaurant_No  
              FROM  Restaurant s
              WHERE s.RESTAURANT_LOCATION = 'City C')
      ORDER BY t.Restaurant_No
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-04
        • 2011-09-19
        • 2015-03-06
        • 1970-01-01
        • 2021-09-15
        • 2021-12-11
        • 2020-11-25
        相关资源
        最近更新 更多