需要从左连接中的表中获取多个值

Mah*_*shi 6 sql sql-server migration left-join

我有一张表格,数据如下.

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

让我们说tblFolders版本1

+----+------------+--------------+--------------+
| id | FolderName | CreatedBy    | ModifiedBy   |
+----+------------+--------------+--------------+
|  1 | SIMPLE     | 5            | 6            |
|  2 | SIMPLE1    | 8            | 1            |
+----+------------+--------------+--------------+
Run Code Online (Sandbox Code Playgroud)

另一个表具有两个版本的用户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               |
+----+----------------+-------------------+
Run Code Online (Sandbox Code Playgroud)

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

虽然我有如下数据

|  1 | SIMPLE     | 5            | 6            |
Run Code Online (Sandbox Code Playgroud)

它应该如下转移

|  1 | SIMPLE     | 321          | 21           |
Run Code Online (Sandbox Code Playgroud)

为此,我在这两个表之间添加了一个连接,如下所示.

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

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

但是如何从tblUsersMapping获取用于ModifiedBy列的用户标识?执行以下操作将无效,并且将为这两列提供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
Run Code Online (Sandbox Code Playgroud)

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

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

PSK*_*PSK 2

如果您想填充每列连接到不同行的列,在这种情况下,您必须像下面一样连接同一个表两次。您无法按照您期望的方式通过单个表连接来获得它。

SELECT id, 
   foldername, 
   B.version2userid AS CreatedBy
   C.Version2UserID    AS ModifiedBy
FROM   tblfolders A WITH(nolock) 
       LEFT JOIN tblusersmapping B WITH(nolock) 
              ON A.createdby = B.version1userid
        LEFT JOIN tblusersmapping C WITH(nolock) 
              ON A.ModifiedBy    = C.version1userid
Run Code Online (Sandbox Code Playgroud)

  • 在您当前的情况下,您必须使用它两次,这是很常见的。如果您的表索引正确,您应该不会遇到任何性能问题。 (2认同)