SQL重复优化

SQL重复优化,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下疑问: 原始查询: 测试数据: DECLARE @Customer_Data TABLE ( Cd_Id INT, cust_number_id INT, First_Name NVARCHAR(30), Last_Name NVARCHAR(30) ) INSERT @Customer_Data (Cd_Id,cust_number_id,First_Name,Last_Name) VALUES (1, 22, N'Alex', N'Bor'),

我有以下疑问:

原始查询:

测试数据:

DECLARE @Customer_Data TABLE
(
    Cd_Id INT,
    cust_number_id INT,
    First_Name NVARCHAR(30),
    Last_Name NVARCHAR(30)
)

INSERT @Customer_Data (Cd_Id,cust_number_id,First_Name,Last_Name)
VALUES (1, 22, N'Alex', N'Bor'),
       (2, 22, N'Alex', N'Bor'),
       (3, 23, N'Alex', N'Bor'),
       (4, 24, N'Tom', N'Cruse'),
       (5, 25, N'Tom', N'Cruse')

DECLARE @Customer TABLE
(
    Cust_id INT,
    Cust_number INT
)


INSERT @Customer (Cust_id, Cust_number)
VALUES (22, 022),
       (23, 023),
       (24, 024),
       (25, 025)

问题是原始查询返回的6行与该行重复。而优化返回只是重复,如何使优化查询也重复行?

我建议只使用窗口函数:

SELECT CD.cud_customer_id
FROM (SELECT cd.*, COUNT(*) OVER (PARTITION BY cud_name, cud_birthday) as cnt_name_bday          FROM dbo.customer_data cd
     ) cd
WHERE cnt_name_bday > 1;
您的查询正在查找姓名或生日的重复项。您希望同时使用这两个副本。

您只能使用一个:


谢谢你的帮助,我已经更新了信息,你能查一下并给我另一个提示吗?我如何实现重复行?我是否正确添加了检查记录是否为空的条件?@Tibomso。我不明白你的评论。这将返回重复的行。谢谢您的帮助,我已经更新了信息,您能查一下并给我另一个提示吗?
DECLARE @Customer_Data TABLE
(
    Cd_Id INT,
    cust_number_id INT,
    First_Name NVARCHAR(30),
    Last_Name NVARCHAR(30)
)

INSERT @Customer_Data (Cd_Id,cust_number_id,First_Name,Last_Name)
VALUES (1, 22, N'Alex', N'Bor'),
       (2, 22, N'Alex', N'Bor'),
       (3, 23, N'Alex', N'Bor'),
       (4, 24, N'Tom', N'Cruse'),
       (5, 25, N'Tom', N'Cruse')

DECLARE @Customer TABLE
(
    Cust_id INT,
    Cust_number INT
)


INSERT @Customer (Cust_id, Cust_number)
VALUES (22, 022),
       (23, 023),
       (24, 024),
       (25, 025)
SELECT CD.cud_customer_id
FROM (SELECT cd.*, COUNT(*) OVER (PARTITION BY cud_name, cud_birthday) as cnt_name_bday          FROM dbo.customer_data cd
     ) cd
WHERE cnt_name_bday > 1;
SELECT cd.cud_customer_id
FROM dbo.customer_data AS cd
WHERE EXISTS (SELECT 1 
              FROM dbo.customer_data AS c 
              WHERE c.cud_name = cd.cud_name AND c.cud_birthday = cd.cud_birthday AND c.cust_id <> cd.cud_customer_id
             );