将查询结果中的数据与PostgreSQL中的不同表数据进行比较

时间:2014-03-04 19:55:05

标签: sql postgresql count sql-order-by left-join

第1步

Select data1,name,phone,address from dummyTable limit 4;

从上面的查询中,我将得到以下结果:

 data1 | name | phone | address

 fgh   | hjk  | 567...| CA 
 ghjkk | jkjii| 555...| NY

现在,在得到上述结果后,我想将我从上面的查询得到的data1记录与名为existingTable的数据库中的现有另一个表匹配,该数据库具有相同的列{{1} } 在里面。如果上面的结果将data1值设为'fgh',那么我会将其视为'fgh'并与名为data1的{​​{1}}列进行比较。

第2步

接下来,在我完成比较后,我需要应用以下条件:

existingtable

所以通过以上条件,我试图解释一下,如果我从结果中得到的值匹配,那么我会将减1计数,如果没有,那么count增加1。

摘要 我基本上想在一个查询中实现这一点,是否可以使用PostgreSQL?

1 个答案:

答案 0 :(得分:0)

我认为您可以将其转换为简单的查询:

SELECT d.data1, d.name, d.phone, d.address
     , count(*) - 2 * count(e.data1)
FROM  (
   SELECT data1, name, phone, address
   FROM   dummytable
   -- ORDER BY ???
   LIMIT  4
   ) d
LEFT   JOIN existingtable e USING (data1)
GROUP  BY d.data1, d.name, d.phone, d.address;

主要成分是LEFT [OUTER] JOIN。请点击手册链接。

count(*)计算dummytable的所有行 count(e.data1)仅计算existingtable中存在匹配data1的行(count()不计算NULL值)。我减去两次以匹配您的公式。

关于ORDER BY:数据库表中没有自然顺序。您需要按某种方式订购以获得可预测的结果。

如果existingtable中可能存在重复,但您希望只计算一次每个不同的data1,请在加入使用EXISTS半连接:

SELECT data1, name, phone, address
      , count(*) - 2 * count(EXISTS (
                          SELECT 1 FROM existingtable e
                          WHERE  e.data1 = d.data1) OR NULL)
FROM  (
   SELECT data1, name, phone, address
   FROM   dummytable
   -- ORDER BY ???
   LIMIT  4
   ) d
GROUP BY data1, name, phone, address;

最后一次计数有效,因为(TRUE OR NULL) IS TRUE,但是(FALSE OR NULL) IS NULL