postgresql 在Postgres中,找出一行中的值是否作为另一行中的值存在,但两个不同的列

xqnpmsa8  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(2)|浏览(130)

我必须创建一个辅助表才能比较它们,如下所示:

WHERE EXISTS  

(SELECT *

    FROM db."fTable2"  

    WHERE (db."fTable2"."idParent" = db."fTable1"."idWit"))

idParent和idWit都存在于Table1中,但是在同一个表中比较这两个表没有结果,而创建一个辅助表fTable2完成了这项工作。
有没有更好的办法?

kq0g1dla

kq0g1dla1#

我猜你有过这样的经历demo

create schema db;
create table db."fTable1" (
  "idParent" int, 
  "idWit" int);
insert into db."fTable1" values 
(11,21),
(12,22),
(13,23),
(14,11),--this one's "idWit" matches the first row's "idParent"
(15,25);

做了一些沿着的事情:

select * from db."fTable1" where db."fTable1"."idParent"=db."fTable1"."idWit";

但是这检查了来自同一行的"idParent""idWit",所以它什么也没找到。所以你做了这样的事情:

select * 
from db."fTable1"
where exists (
  select * 
  from db."fTable1"
  where (db."fTable1"."idParent" = db."fTable1"."idWit"));

但是同样没有找到任何东西,因为exists中的子查询正在检查完全相同的事情:这两个值是否相同。所以你把它们放到另一个表中:

create table db."fTable2" as table db."fTable1";

现在它可以工作了,因为它现在从db."fTable1"中获取行,并在db."fTable2"中查找匹配的行。问题是,您可以使用别名db."fTable1"来显式地声明您引用了同一个表两次,而不必克隆它:

select * 
from db."fTable1" as t1
where exists (
  select * 
  from db."fTable1" as t2
  where t2."idParent"=t1."idWit"); --acts as if it was a whole other table now

或者,作为@Kaushik Narayanpointed out,你可以用它本身join表:

select * 
from db."fTable1" as t1 
inner join db."fTable1" as t2
on t2."idParent"=t1."idWit";

这是一堆猜测。如果你展示你的create table语句,你实际尝试的代码,你得到的结果或错误以及你期望的结果,你会得到更清晰、更快的答案。

p4rjhz4m

p4rjhz4m2#

SELECT * FROM db."fTable2" INNER JOIN db."fTable1" ON db."fTable2"."idParent" = db."fTable1"."idWit"

JOINs是你所需要的。

相关问题