Sql 从有序列表中只包含一个匹配项的左联接
我有以下团队成员表:Sql 从有序列表中只包含一个匹配项的左联接,sql,sql-server,join,left-join,Sql,Sql Server,Join,Left Join,我有以下团队成员表: +-------+-------+--------+ | ID_no | Name | Team | +-------+-------+--------+ | 1 | John | Green | | 2 | Carry | Green | | 3 | Susan | Yellow | | 4 | Lola | Green | | 5 | Marc | Yellow | | 6 | Mike | Yello
+-------+-------+--------+
| ID_no | Name | Team |
+-------+-------+--------+
| 1 | John | Green |
| 2 | Carry | Green |
| 3 | Susan | Yellow |
| 4 | Lola | Green |
| 5 | Marc | Yellow |
| 6 | Mike | Yellow |
| 7 | Luke | Yellow |
+-------+-------+--------+
以及以下自由位置表
+----+--------+-------------+
| RN | Team | ID_position |
+----+--------+-------------+
| 1 | Green | A1 |
| 2 | Green | A2 |
| 3 | Green | A3 |
| 4 | Green | A4 |
| 5 | Green | A5 |
| 6 | Green | A6 |
| 7 | Green | A7 |
| 8 | Green | A8 |
| 1 | Yellow | A21 |
| 2 | Yellow | A22 |
| 3 | Yellow | A23 |
| 4 | Yellow | A24 |
| 5 | Yellow | A25 |
| 6 | Yellow | A26 |
| 7 | Yellow | A27 |
+----+--------+-------------+
我的目标是让第一张桌子上的每个人都有一个为每个队保留的自由位置。
查询应遵循第二个表中RN的顺序,因此结果应如下所示:
+-------+-------+--------+-------------+
| ID_no | Name | Team | ID_position |
+-------+-------+--------+-------------+
| 1 | John | Green | A1 |
| 2 | Carry | Green | A2 |
| 3 | Susan | Yellow | A21 |
| 4 | Lola | Green | A3 |
| 5 | Marc | Yellow | A22 |
| 6 | Mike | Yellow | A23 |
| 7 | Luke | Yellow | A24 |
+-------+-------+--------+-------------+
我尝试了几个左联接,但我不知道如何只匹配右表的每一行。第二个问题是如何为每个团队遵循RN列的顺序
这就是我尝试过的
/* FIRST TABLE: #Team_members */
SELECT *
INTO #Team_members
FROM (
SELECT '1' AS [ID_no],'John' AS [Name],'Green' AS [Team] UNION ALL
SELECT '2' AS [ID_no],'Carry' AS [Name],'Green' AS [Team] UNION ALL
SELECT '3' AS [ID_no],'Susan' AS [Name],'Yellow' AS [Team] UNION ALL
SELECT '4' AS [ID_no],'Lola' AS [Name],'Green' AS [Team] UNION ALL
SELECT '5' AS [ID_no],'Marc' AS [Name],'Yellow' AS [Team] UNION ALL
SELECT '6' AS [ID_no],'Mike' AS [Name],'Yellow' AS [Team] UNION ALL
SELECT '7' AS [ID_no],'Luke' AS [Name],'Yellow' AS [Team]
) T
/* SECOND TABLE: #Free_positions */
SELECT *
INTO #Free_positions
FROM (
SELECT '1' AS [RN],'Green' AS [Team],'A1' AS [ID_position] UNION ALL
SELECT '2' AS [RN],'Green' AS [Team],'A2' AS [ID_position] UNION ALL
SELECT '3' AS [RN],'Green' AS [Team],'A3' AS [ID_position] UNION ALL
SELECT '4' AS [RN],'Green' AS [Team],'A4' AS [ID_position] UNION ALL
SELECT '5' AS [RN],'Green' AS [Team],'A5' AS [ID_position] UNION ALL
SELECT '6' AS [RN],'Green' AS [Team],'A6' AS [ID_position] UNION ALL
SELECT '7' AS [RN],'Green' AS [Team],'A7' AS [ID_position] UNION ALL
SELECT '8' AS [RN],'Green' AS [Team],'A8' AS [ID_position] UNION ALL
SELECT '1' AS [RN],'Yellow' AS [Team],'A21' AS [ID_position] UNION ALL
SELECT '2' AS [RN],'Yellow' AS [Team],'A22' AS [ID_position] UNION ALL
SELECT '3' AS [RN],'Yellow' AS [Team],'A23' AS [ID_position] UNION ALL
SELECT '4' AS [RN],'Yellow' AS [Team],'A24' AS [ID_position] UNION ALL
SELECT '5' AS [RN],'Yellow' AS [Team],'A25' AS [ID_position] UNION ALL
SELECT '6' AS [RN],'Yellow' AS [Team],'A26' AS [ID_position] UNION ALL
SELECT '7' AS [RN],'Yellow' AS [Team],'A27' AS [ID_position]
) T
/* JOIN */
SELECT A.*, B.ID_position
FROM #Team_members A LEFT JOIN #Free_positions B
ON A.[Team] = B.[Team] AND B.RN = 1
您可以尝试以下方法:
SELECT A.ID_No, A.NAME, A.TEAM, B.ID_POSITION
FROM (SELECT ID_No, NAME, TEAM, ROW_NUMBER() OVER (PARTITION BY TEAM ORDER BY ID_NO) AS RN_TM
FROM TEAM_MEMBERS) A
LEFT JOIN FREE_POSITIONS B ON A.RN_TM=B.RN AND A.TEAM=B.TEAM;
您可以尝试以下方法:
SELECT A.ID_No, A.NAME, A.TEAM, B.ID_POSITION
FROM (SELECT ID_No, NAME, TEAM, ROW_NUMBER() OVER (PARTITION BY TEAM ORDER BY ID_NO) AS RN_TM
FROM TEAM_MEMBERS) A
LEFT JOIN FREE_POSITIONS B ON A.RN_TM=B.RN AND A.TEAM=B.TEAM;
显示您的查询尝试。@jarlh我已经添加了我尝试的内容。显示您的查询尝试。@jarlh我已经添加了我尝试的内容。这是正确的方向,但并不完全正确。您还需要为团队成员提供行号。然后加入需要包括团队。没有注意到这一部分。但是你的加入还需要包括团队。@Sean:是的,你的加入是正确的。答案已更新。谢谢。这是正确的方向,但不完全正确。您还需要为团队成员提供行号。然后加入需要包括团队。没有注意到这一部分。但是你的加入还需要包括团队。@Sean:是的,你的加入是正确的。答案已更新。谢谢