SQL:使用不同的标识符/密钥和不同的数据集数填充其他表中的列

SQL:使用不同的标识符/密钥和不同的数据集数填充其他表中的列

问题描述:

假设dataTarget列为空,如何填充dataSource中的数据(如下所示)?SQL:使用不同的标识符/密钥和不同的数据集数填充其他表中的列

来源

id  otherSubId dataSource 
------------------------------ 
4000 10   DataA 
4000 20   DataB 
4000 30   DataC 
4000 40   DataD 
6000 1000  DataAA 
6000 2000  DataBB 
6000 3000  DataCC 
6000 4000  DataDD 

目标

id  subId dataTarget 
-------------------------- 
4000 100  DataA 
4000 200  DataB 
4000 300  DataC 
6000 100  DataAA 
6000 300  DataCC 
6000 400  DataDD 
6000 500  
6000 200  DataBB 

请注意 -

  • DataDdataSource没有使用
  • dataTargetid6000subId500留空,因为没有更多的数据为最后一组。

我想创建一个tempId柱填充(1 2,3,...)所需要的顺序号由otherSubId两个表有序每一个独特的idid结合起来创造的东西之间的连接这两个表,但我想知道如果有人有更好的方法,而不改变表。

+1

什么是您的RDBMS? –

+0

现在尚未确定,但可以说MySQL/PostgresQL。 –

+0

对英语使用做了小的改进。表格单独列出。 'DataD','dataSource'等格式化为代码片段(将线的一部分而不是整行作为代码片段进行格式化,突出显示片段并单击“{}”按钮或放置一个“ '片段两侧的字符) – toonice

对于PostgreSQL,你可以使用ROW_NUMBER()基本上模仿你有一个tempid的计划,但都在一个查询:

SELECT * 
FROM (SELECT id, subID, dataTarget, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY subID asc) RN 
     FROM target 
    ) T 
JOIN (SELECT id, othersubID, dataSource, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY othersubID asc) RN 
     FROM source 
    ) S ON S.id = T.id 
     AND S.RN = T.RN 

更新将是:

UPDATE T 
SET T.dataTarget = S.dataSource 
FROM (SELECT id, subID, dataTarget, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY subID asc) RN 
     FROM target 
    ) T 
JOIN (SELECT id, othersubID, dataSource, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY othersubID asc) RN 
     FROM source 
    ) S ON S.id = T.id 
     AND S.RN = T.RN 

我也很好奇你的示例数据是如何代表实际表格的。如果真的,看起来就像是,你可以在连接谓词添加或删除0

SELECT * 
FROM Target T 
JOIN Source S ON T.id = S.id 
      AND (t.subId * 10 = s.othersubID OR 
        t.subId/10 = s.othersubID) 

这应该在任何RDBMS工作,假设subID不是一个字符串。如果是这样,你必须连接或删除0而不是数学。