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)