這是一個遷移腳本。
公司表:
| 員工ID | 部門 ID |
|---|---|
| 美國廣播公司 | div1 |
| 定義 | div1 |
| 美國廣播公司 | div1 |
| 美國廣播公司 | div2 |
| xyz | div2 |
在下面的代碼中,我正在選擇重復的 EmployeeId-DivisionId 組合,即將選擇具有相同 EmployeeId 和 DivisionId 的記錄。因此,從上表中,具有abc-div1組合的兩行將由以下代碼選擇。
我怎樣才能反轉它?這似乎很簡單,但我無法弄清楚。我嘗試用HAVING count(*) = 0而不是 替換> 1,我嘗試擺弄 ON 和 AND 行中的等號。基本上從上表中,我想選擇其他三行沒有abc-div1組合。如果有辦法選擇所有唯一的 EmployeeID-DivisionId 組合,請告訴我。
SELECT a.EmployeeID, a.DivisionId FROM CompanyTable a
JOIN ( SELECT EmployeeID, DivisionId
FROM CompanyTable
GROUP BY EmployeeID, DivisionId
HAVING count(*) > 1 ) b
ON a.EmployeeID = b.EmployeeID
AND a.DivisionId = b.DivisionId;
EmployeeId 和 DivisionId 都是 nvarchar(50) 列。
uj5u.com熱心網友回復:
視窗計數似乎是一種合適的方法:
select employeeid, divisionid
from (
select *, Count(*) over(partition by employeeid, divisionid) ct
from t
)t
where ct = 1;
uj5u.com熱心網友回復:
如前所述,您必須將 > 1 替換為其真正的對立面 <= 1,這有效:db<>fiddle
uj5u.com熱心網友回復:
首先,讓我們嘗試使用公用表運算式 (CTE) 而不是子查詢重寫您的查詢:
WITH cteCompanyTableStats as (
SELECT
EmployeeID, DivisionId,
HasDuplicates = CASE WHEN count(*) > 1 THEN1 ELSE 0 END
FROM CompanyTable
GROUP BY EmployeeID, DivisionId
)
SELECT ct.*
FROM CompanyTable ct
inner join cteCompanyTableStats cts on
ct.EmployeeId = cts.EmployeeId
and ct.DivisionId = cts.DivisionId
and cts.HasDuplicates = 1
請注意我是如何洗掉該HAVING子句并添加一個新HasDuplicates列的?我們將使用該新列來查找-DON'T-具有重復項的所有表行:
WITH cteCompanyTableStats as (
SELECT
EmployeeID, DivisionId,
HasDuplicates = CASE WHEN count(*) > 1 THEN1 ELSE 0 END
FROM CompanyTable
GROUP BY EmployeeID, DivisionId
)
SELECT ct.*
FROM CompanyTable ct
inner join cteCompanyTableStats cts on
ct.EmployeeId = cts.EmployeeId
and ct.DivisionId = cts.DivisionId
and cts.HasDuplicates = 0
兩個查詢之間唯一改變的 SQL 代碼字符是最后一行,其中and cts.HasDuplicates = ###設定了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/474603.html
下一篇:自定義層次結構
