我希望从表中选择数据,当且仅当唯一的手机号码等于表中的总行数(即我们没有两个不同的人使用相同的手机号码,和/或我们没有在手机号码列中有一行为空值),其中有一个特定的区号,例如4817。

目前,我有以下查询(不适用于 AND 约束)。有没有人有关于如何做到这一点的任何提示?

SELECT
  MOB_NUM   AS MOBILE_NUMBER,
  NAME      AS NAME,
  AREA_CODE AS AREA_CODE

  FROM DB_PHONEBOOK DBP
  WHERE DBP.AREA_CODE = 4817
  AND (COUNT(DISTINCT DBP.MOB_NUM ) = COUNT(DBP.MOB_NUM))

最佳答案

使用 Where 子句过滤单个行/记录,其中像 count/Sum/Average/.. 这样的组使用 Having 子句过滤

如果没有错,你正在寻找这样的东西

SELECT DBP.MOB_NUM   AS MOBILE_NUMBER,
       DBP.NAME      AS NAME,
       DBP.AREA_CODE AS AREA_CODE
FROM   DB_PHONEBOOK DBP
       INNER JOIN (SELECT MOB_NUM
                   FROM   DB_PHONEBOOK DBP
                   WHERE  DBP.AREA_CODE = 4817
                   GROUP  BY MOB_NUM
                   HAVING Count(DISTINCT DBP.MOB_NUM) = Count(DBP.MOB_NUM)) C_DBP
               ON DBP.MOB_NUM = C_DBP.MOB_NUM
WHERE  DBP.AREA_CODE = 4817

10-07 16:10