我正在尝试开发一个查询来识别具有多个客户端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分钟。我究竟做错了什么?
答案 0 :(得分:0)
我相信某些 喜欢 这会更好地表现并为您提供更多灵活性:
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"