Sql-Server

SQL 查詢對匹配記錄 ID 的結果進行分組

  • April 26, 2022

我在設計查詢時遇到問題。我有一個 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)只返回匹配的記錄DateOfBirthand Gender(因此使用 anINNER而不是OUTER JOINwhich 將確保過濾掉與此子句不匹配的任何內容)。

然後在WHERE子句中是我們如何過濾InputPersons到僅PersonId我們關心的特定 s 。

最後,如果您觀察該SELECT列表,您會注意到我們從表的相關實例中選擇了我們需要的適當欄位。還要注意DISTINCTSELECT子句中使用 刪除任何重複的結果,如果兩個不同Persons的結果具有相同的DateOfBirthGender(這將導致結果的多對多基數)。

引用自:https://dba.stackexchange.com/questions/311318