Sql-Server
SQL 查詢對匹配記錄 ID 的結果進行分組
我在設計查詢時遇到問題。我有一個 Persons 表中記錄的 PersonIds 列表。我希望有一個查詢,該查詢採用此 PersonIds 列表並返回表中與每個輸入人員的出生日期和性別相匹配的其他記錄,由 InputPersonId 聚合,因此每個返回的記錄將具有:
- 輸入人員 ID
- 匹配人員 ID
- 出生日期
- 性別
樣本數據:
人員表
PersonId DateOfBirth Gender 1 1/1/1950 M 2 1/2/1950 M 3 1/1/1950 M 4 1/1/1950 F 5 1/1/1950 F 6 1/2/1950 F
一個例子是,我可能希望 PersonIds 1 和 4 的所有記錄都匹配 DateOfBirth 和 Gender。我希望輸出為
InputPersonId MatchedPersonId DateOfBirth Gender 1 1 1/1/1950 M 1 3 1/1/1950 M 4 4 1/1/1950 F 4 5 1/1/1950 F
您應該能夠通過以下方式實現您的目標:
SELECT DISTINCT InputPersons.PersonId AS InputPersonId, MatchedPersons.PersonId AS MatchedPersonId, MatchedPersons.DateOfBirth, MatchedPersons.Gender FROM Persons AS InputPersons INNER JOIN Persons AS MatchedPersons ON InputPersons.DateOfBirth = MatchedPersons.DateOfBirth AND InputPersons.Gender = MatchedPersons.Gender WHERE InputPersons.PersonId IN (1, 4);
所以讓我們檢查一下這個查詢在做什麼。從該
FROM
子句開始,我們從Persons
我們別名(如本地暱稱/引用)的表開始InputPersons
,然後INNER JOIN
將它自己(別名為MatchedPersons
)只返回匹配的記錄DateOfBirth
andGender
(因此使用 anINNER
而不是OUTER JOIN
which 將確保過濾掉與此子句不匹配的任何內容)。然後在
WHERE
子句中是我們如何過濾InputPersons
到僅PersonId
我們關心的特定 s 。最後,如果您觀察該
SELECT
列表,您會注意到我們從表的相關實例中選擇了我們需要的適當欄位。還要注意DISTINCT
在SELECT
子句中使用 刪除任何重複的結果,如果兩個不同Persons
的結果具有相同的DateOfBirth
和Gender
(這將導致結果的多對多基數)。