Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在Postgres中选择非重复值_Postgresql_Select_Distinct - Fatal编程技术网

Postgresql 在Postgres中选择非重复值

Postgresql 在Postgres中选择非重复值,postgresql,select,distinct,Postgresql,Select,Distinct,它返回: SELECT DISTINCT a.s_id, select2Result.s_id, select2Result."mNrPhone", select2Result."dNrPhone" FROM "Table1" AS a INNER JOIN ( SELECT b.s_id, c."mNrPhone", c."dNrPhone" FROM "Table2" AS b, "Table3" AS c WHERE b.a_id = 1001

它返回:

SELECT DISTINCT a.s_id, select2Result.s_id, select2Result."mNrPhone", 
       select2Result."dNrPhone" 
FROM "Table1" AS a INNER JOIN
    (
    SELECT b.s_id, c."mNrPhone", c."dNrPhone" FROM "Table2" AS b, "Table3" AS c  
    WHERE b.a_id = 1001 AND b.s_id = c.s_id
    ORDER BY b.last_name) AS select2Result
ON a.a_id = select2Result.student_id
WHERE a.k_id = 11211 

1002值重复两次,但不应该重复,因为我使用了
DISTINCT
,并且没有其他表的id重复了两次。

限定符DISTINCT适用于整行,而不是选择列表中的第一列。由于第3列和第4列(
mNrPhone
dNrPhone
)对于
s_id=1002
的两行是不同的,DBMS正确地列出了这两行。如果只希望
s_id=1002
出现一次,并且必须决定要显示哪些辅助数据,则必须以不同的方式编写查询

另外,强烈建议您在所有查询和子查询中始终使用显式连接表示法(在SQL-92中引入)。不要使用旧的隐式连接表示法(这是SQL-86或SQL-89中可用的全部),尤其不要混合使用显式和隐式连接表示法(其中子查询使用隐式连接,而主查询使用显式连接)。您需要知道旧的表示法,以便能够理解旧的查询。您应该用新的表示法编写新的查询。

您可以这样使用:

1001;1001;"";""
1002;1002;"";""
1002;1002;"2342342232123";"2342342"
1003;1003;"";""
1004;1004;"";""

但是就像其他人告诉你的那样,“重复记录”确实不同。

首先,显示的查询根本不起作用,
学生id
在子查询中丢失。稍后在联接中使用它

更有趣的是:

使用
DISTINCT
DISTINCT
DISTINCT ON
根据要区分的列集对所有行进行排序,返回不同的值,然后从每个列集中选择第一行。它按常规
不同的
的所有行进行排序,仅按
不同的
的指定行进行排序。这里有机会从集合中挑选出某些行,而不是其他行

例如,如果您在示例中更喜欢不带空“mNrPhone”的行:

   SELECT DISTINCT ON (a.s_id) 
          a.s_id, select2Result.s_id, select2Result."mNrPhone", 
          select2Result."dNrPhone"
   ...
这两行(对于a.s_id=1002)是不同的。其中一个有两个值,另一个有四个值。如果不重复“1002”,dbms如何知道返回这两行中的哪一行?编辑您的问题并描述您的实际问题可能会对您有所帮助。(你上面描述的不是你的实际问题;这是一个不太有效的解决方案。)
SELECT DISTINCT ON (a.s_id)   -- sure you didn't want a.a_id?
      ,a.s_id AS a_s_id  -- use aliases to avoid dupe name
      ,s.s_id AS s_s_id
      ,s."mNrPhone"
      ,s."dNrPhone" 
FROM  "Table1" a
JOIN  (
    SELECT b.s_id, c."mNrPhone", c."dNrPhone", ??.student_id  -- misssing!
    FROM  "Table2" b
    JOIN  "Table3" c USING (s_id)
    WHERE  b.a_id = 1001 
    --    ORDER  BY b.last_name  -- pointless, DISTINCT will re-order
     ) s ON a.a_id = s.student_id
WHERE  a.k_id = 11211
ORDER  BY a.s_id -- first col must agree with DISTINCT ON, could add DESC though
         ,("mNrPhone" <> '') DESC -- non-empty first
SELECT a.a_id, s.s_id, s."mNrPhone", s."dNrPhone" -- picking a.a_id over s_id
FROM  "Table1" a
JOIN  (
    SELECT DISTINCT ON (b.s_id)
          ,b.s_id, c."mNrPhone", c."dNrPhone", ??.student_id  -- misssing!
    FROM  "Table2" b
    JOIN  "Table3" c USING (s_id)
    WHERE  b.a_id = 1001 
    ORDER  BY b.s_id, (c."mNrPhone" <> '') DESC -- pick non-empty first
     ) s ON a.a_id = s.student_id
WHERE  a.k_id = 11211
ORDER  BY a.a_id  -- now you can ORDER BY freely