2017-07-05 39 views
0

假設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

回答

0

對於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而不是數學。

相關問題