如何使用IN子句将更多列强制到元组中,然后在只返回一列的查询结果中查找该元组



我有两个Postgresql表table_jtable_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;

最新更新