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.当我传输数据时,CreatedBy和Modifiedby 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?
如果您想填充每列连接到不同行的列,在这种情况下,您必须像下面一样连接同一个表两次。您无法按照您期望的方式通过单个表连接来获得它。
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)