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
请注意 -
-
DataD
从dataSource
没有使用 -
dataTarget
与id
值6000
和subId
值500
留空,因为没有更多的数据为最后一组。
我想创建一个tempId
柱填充(1 2,3,...)所需要的顺序号由otherSubId
两个表有序每一个独特的id
与id
结合起来创造的东西之间的连接这两个表,但我想知道如果有人有更好的方法,而不改变表。
答
对于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
而不是数学。
什么是您的RDBMS? –
现在尚未确定,但可以说MySQL/PostgresQL。 –
对英语使用做了小的改进。表格单独列出。 'DataD','dataSource'等格式化为代码片段(将线的一部分而不是整行作为代码片段进行格式化,突出显示片段并单击“{}”按钮或放置一个“ '片段两侧的字符) – toonice