首页 > 解决方案 > 需要从左连接中的表中获取多个值

问题描述

我有一个包含如下数据的表格。

假设我有两个版本的项目,我需要将数据从旧版本迁移到新版本。

假设tblFolders在版本1

+----+------------+--------------+--------------+
| id | FolderName | CreatedBy    | ModifiedBy   |
+----+------------+--------------+--------------+
|  1 | SIMPLE     | 5            | 6            |
|  2 | SIMPLE1    | 8            | 1            |
+----+------------+--------------+--------------+

另一个表具有两个版本的用户 ID。

让我们说它tblUsersMapping

+----+----------------+-------------------+
| id | Version1UserID | Version2UserID    |
+----+----------------+-------------------+
|  1 | 1              | 500               |
|  2 | 2              | 465               |
|  3 | 3              | 12                |
|  4 | 4              | 85                |
|  5 | 5              | 321               |
|  6 | 6              | 21                |
|  7 | 7              | 44                |
|  8 | 8              | 884               |
+----+----------------+-------------------+

现在我需要将数据从版本 1 传输到版本 2。当我传输数据时,CreatedByModifiedby ids 应该是新版本的。

所以虽然我有如下数据

|  1 | SIMPLE     | 5            | 6            |

它应该如下转移

|  1 | SIMPLE     | 321          | 21           |

为此,到目前为止,我在这两个表之间添加了一个连接,如下所示。

SELECT id, 
   foldername, 
   B.version2userid AS CreatedBy
FROM   tblfolders A WITH(nolock) 
       LEFT JOIN tblusersmapping B WITH(nolock) 
              ON A.createdby = B.version1userid

这将为我提供列CreatedBy的正确结果。

但是如何从 tblUsersMapping 获取 ModifiedBy 列的用户 ID?执行以下操作将不起作用,并且将为两列提供 NULL。

SELECT    id, 
      foldername, 
      b.version2userid AS createdby, 
      b.version2userid AS modifiedby 
FROM      tblfolders A WITH(nolock) 
LEFT JOIN tblusersmapping B WITH(nolock) 
ON        a.createdby = b.version1userid, 
          a.modifiedby = b.version1userid

一种方法是我可以使用 tblusersmapping 表添加另一个联接。但这不是一个好主意,因为表可能有大量数据,而另一个连接会影响查询的性能。

我的问题是如何根据 createdby 和 modifiedby 列从映射表中获取 Version1UserID 和 Version2UserID ?

标签: sqlsql-servermigrationleft-join

解决方案


您可以使用多项选择,这可能会对您有所帮助。

SELECT id, 
foldername, 
(SELECT version2userid from tblUsersMapping where Version1UserID=tblfolders.CreatedBy) AS CreatedBy,
(SELECT version2userid from tblUsersMapping where Version1UserID=tblfolders.ModifiedBy) AS ModifiedBy
FROM   tblfolders

推荐阅读