![](/img/trans.png)
[英]How can I select all rows from a table where the combination of two columns is distinct on each row (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 @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
)
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.