第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?
答案 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
。