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

SQL:使用不同的标识符/键和不同数量的数据集填充其他表中的列,sql,set,distinct,identifier,Sql,Set,Distinct,Identifier,假设dataTarget列为空,如何使用dataSource中的数据填充它,如下所示 来源 目标 请注意- 未使用来自数据源的DataD dataTarget的id值为6000且subId值为500的值保留为空,因为最后一组没有更多数据 我正在考虑为两个表上由otherSubId排序的每个唯一id创建一个tempId列,填充所需的序号(1、2、3,…),并将其与id组合,以创建两个表之间的连接,但是我想知道是否有人在不改变表的情况下有更好的方法。对于PostgreSQL,您可以使用ROW\u

假设
dataTarget
列为空,如何使用
dataSource
中的数据填充它,如下所示

来源

目标

请注意-

  • 未使用来自
    数据源的
    DataD
  • dataTarget
    id
    值为
    6000
    subId
    值为
    500
    的值保留为空,因为最后一组没有更多数据

我正在考虑为两个表上由
otherSubId
排序的每个唯一
id
创建一个
tempId
列,填充所需的序号(1、2、3,…),并将其与
id
组合,以创建两个表之间的连接,但是我想知道是否有人在不改变表的情况下有更好的方法。

对于PostgreSQL,您可以使用
ROW\u 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)

假设
subID
不是一个字符串,那么这应该适用于任何RDBMS。如果是,你必须连接或删除一个
0
,而不是做数学运算。

你的RDBMS是什么?现在还没有决定,但是让我们假设MySQL/PostgresQL。对英语用法做了一些小的改进。单独列出的表格
DataD
dataSource
等。格式化为代码片段(要将一行的一部分而不是整行格式化为代码片段,请突出显示该片段,然后单击
{}
按钮或在片段的任一侧放置一个“``字符),
otherSubId
subId
之间的关系如何?如何选择源表中的哪个值放在目标表中某个记录的
dataTarget
值中?
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
SELECT *
FROM Target T
JOIN Source S ON T.id = S.id
             AND (t.subId * 10 = s.othersubID OR
                  t.subId / 10 = s.othersubID)