Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从有序列表中只包含一个匹配项的左联接_Sql_Sql Server_Join_Left Join - Fatal编程技术网

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:是的,你的加入是正确的。答案已更新。谢谢