簡體   English   中英

SQL:psql中的邏輯問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM