簡體   English   中英

如何通過列值使兩個表中的行相互“取消”(SQL server)

[英]How to make rows from two table "Cancel" each other by columns values(SQL server)

假設我有 A,B 兩個表,都包含日期和時間列,我希望 A 表查看 B 表,表 A 將為 B 表中找到的每個重復項從自身刪除 1 行。

一個
2021-12-24 9:30:00
2021-12-24 10:00:00
2021-12-24 10:30:00
2021-12-24 11:00:00
2021-12-24 11:30:00
2021-12-24 11:00:00
2021-12-24 11:30:00
2021-12-24 9:30:00
2021-12-24 11:00:00
2021-12-24 11:00:00
2021-12-24 11:30:00

結果應該是

A(結果)
2021-12-24 10:00:00
2021-12-24 10:30:00
2021-12-24 11:30:00

以下是實際代碼,@tmp_leave 是表 A,@tmp_cancelLeave 是表 B

我努力了...

  • 使用 DELETE FROM WHERE EXISTS (子查詢) 如果它在表 B 中發現甚至只有 1 個重復項,它會從表 A 中刪除多行,這是我不想要的。
DELETE FROM @tmp_leave 
    WHERE EXISTS (
        SELECT * 
        FROM @tmp_cancelLeave c
        WHERE (SELECT TOP 1 applicant_name FROM @tmp_leave)= c.applicant_name 
    AND (SELECT TOP 1 calender_date FROM @tmp_leave)= c.calender_date
    AND (SELECT TOP 1 timeslot FROM @tmp_leave)= c.timeslot  
)
  • 使用 While 循環(它可以工作,但性能很差,感覺很愚蠢......如果@tmp_cancelLeave 的順序與@tmp_leave 不同,它根本不起作用。)
DECLARE @cnt INT = 0;
DECLARE @max INT = (SELECT COUNT(*) FROM @tmp_leave)

WHILE @cnt < @max
BEGIN
DELETE TOP(1) FROM @tmp_leave 
    WHERE applicant_name IN(SELECT applicant_name FROM @tmp_cancelLeave)
    AND calender_date IN(SELECT calender_date FROM @tmp_cancelLeave)
    AND timeslot IN(SELECT timeslot FROM @tmp_cancelLeave)
    
DELETE TOP(1) FROm @tmp_cancelLeave
    
    SET @cnt = @cnt + 1;

請注意,這與簡單地使用 DELETE FROM WHERE EXISTS 不同,因為如果 EXISTS 在表 B 中僅找到一個重復項,EXISTS 將從表 A 中刪除多行,而我不想這樣做。 我只想為 B 中找到的每一行從 A 中刪除一個相同的行。

我已經嘗試了一天左右,非常感謝任何幫助!

您可以通過為兩個表中的每一個分配一個行號,然后從日期、時間和行號都匹配的 A 表中刪除來做到這一點。

WITH cteA AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY [date], [time] ORDER BY [time]) AS rn
    FROM A
), cteB AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY [date], [time] ORDER BY [time]) AS rn
    FROM B
)
DELETE cteA
FROM       cteA
INNER JOIN cteB
        ON cteA.[date] = cteB.[date]
       AND cteA.[time] = cteB.[time]
       AND cteA.rn     = cteB.rn;

此處查看演示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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