我有两个Postgresql表table_j
和table_r
,其中包含一些共同的字段:
a, b, c, d
我想从table_r
中提取这些字段的元组,其中满足其他字段的条件,并且由于在字段a, b, c, d
上具有相同值的记录可以满足此条件,所以我想提取唯一元组。
select distinct(a, b, c, d) from table_r where date > '2022-05-01' and code='123456'
我想从table_j
中提取与上一个查询中字段a、b、c、d的值匹配的记录。
我试过这样做:
select a, b, c, d, e
from table_j
where (a, b, c, d) in
( select distinct(a, b, c, d) from table_r where date > '2022-05-01' and code='123456' )
order by a, b, c, d;
但它告诉
ERROR: the subquery has too few columns
LINE 1: e from table_j where (a, b, c, d) in
^
所以我敢打赌,这意味着子查询的结果只有一列,而片段
where (a, b, c, d) in
从";外部";查询将(a, b, c, d)
分为四列,即使我已经将它们放在括号之间。
那么,我如何才能将该片段中的这4列变成只包含四个字段的元组的一列呢?
distinct
是而不是函数,并且始终应用于SELECT列表的所有列。将一列或多列括在括号中不会更改DISTINCT的结果。
您的问题源于(a,b,c,d)
在Postgres中创建了一个以匿名记录为类型的单列。它不返回四列,而只返回一列。因此,与来自IN条件的四列的比较失败。
此外:在in条件的子查询中,distinct
实际上是无用的,因为in运算符只检查第一个匹配。它甚至可能使事情变得更慢。
select a, b, c, d, e
from table_j
where (a, b, c, d) in (select distinct a, b, c, d
from table_r
where date > '2022-05-01'
and code='123456' )
order by a, b, c, d;