[英]SQL: Logic problems in psql
我正在嘗試開發查詢以識別具有多個客戶端ID的客戶端。 客戶ID在第1列,第19列和第20列中包含唯一的個人標識符,您可以將它們視為某種社會安全號碼(我們將其稱為SSN.19和SSN.20)
我的第一個想法是尋找具有匹配的SSN但客戶端ID不同的每一行,如下所示:
SELECT
a."5", a."3"||' '||a."4" as "3+4", a."19", a."20", a."21", a."1",
b."1", a."8"
FROM
"clients_1" AS a,
"clients_1" AS b
WHERE a."19"=b."19" and a."20"=b."20" and a."1"<b."1" and a."1"='Value';
但是,它返回了0行。 為了檢查表是否確實沒有重復,我執行了以下查詢:
select distinct "19" as hk, count("19") as dl from "clients_1" group by "19" order by dl desc;
select distinct "20" as hk, count("20") as dl from "clients_1" group by "20" order by dl desc;
事實證明,在此特定表上,沒有客戶端具有與之關聯的SSN19,但是表中有多個重復的SSN20。 因此,我執行以下查詢來查找具有多個ID的客戶端:
SELECT
a."5", a."3"||' '||a."4" as "3+4", a."20", a."21", a."1",
b."1", a."8"
FROM
"clients_1" AS a,
"clients_1" AS b
WHERE a."20"=b."20" and a."1"<b."1" and a."7"='Value';
此表返回了一個表,其中包含多個具有不同ID但具有相同SSN20的客戶端。 之后,我開始考慮一種針對客戶同時具有SSN19和SSN20或其中之一的情況將查詢通用化的方法,因此我想到了以下幾點:
SELECT
a."5", a."3"||' '||a."4" as "3+4", a."19", a."20", a."21", a."1",
b."1", a."8"
FROM
"clients_1" AS a,
"clients_1" AS b
WHERE ((a."19"=b."19" and a."19" is not null) or (a."20"=b."20" and a."20" is not null)) and a."1"<b."1" and a."7"='Value';
但是,此查詢要花很長時間,我讓查詢運行了大約20分鍾,但什么也沒回來,而之前的嘗試最多花了大約2分鍾。 我究竟做錯了什么?
我相信這樣的事情會更好的表演,給你更多的靈活性:
SELECT
*
FROM
(
SELECT
COUNT(*) OVER (PARTITION BY "19") as 19_matches,
COUNT(*) OVER (PARTITION BY "20") as 20_matches,
COUNT(*) OVER (PARTITION BY "19","20") as both_matches,
clients_1.*
FROM
clients_1
WHERE "7" = 'value'
)
WHERE 19_matches > 1 OR 20_matches > 1 or both_matches > 1
ORDER BY "19","20"
除了難看的列名,這只是WHERE EXISTS(a similar record)
解決方案:
SELECT *
FROM clients_1 AS a
WHERE EXISTS(
SELECT* FROM clients_1 AS b
WHERE (a."19" = b."19" OR a."20" = b."20" )
AND a."1" <> b."1"
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.