2013-10-30 83 views
1

以下是兩個表。我想根據兩個表中的信息更新(不選擇)第一個表。MySQL:根據來自A和B表的數據更新表A

第一個表命名somecities

Name - State - Country - Info1 - Info2 
Orlando - FL - US - 123 -AAA 
Hrodna - HV - BY - 890 -BBB 

命名allcities第二張表:

Name - State - Country - Info1 
Orlando - FL - US - 123 
Orlando - KY - US - 456 
Orlando - WV - US - 789 
Orlando - SW - SA - 333 
Hrodna - HV - BY - 890 
Minsk - MV - BY - 199 

任何從somecities表對(姓名,省,國家)的是在allcities表,如果它很重要。所以,allcities表更大。

我想修改somecities這樣:

1)坐第一排,採取Orlando。它會在allcities中遇到4次。所以,製作4個奧蘭多線而不是1個(向3個城市增加3個)。

2)走下一個城市(第二個和最後一個) - HrodnaHrodna在allcities中僅遇到一次,所以我們不會向somecities添加任何行(添加零行)。

3)在somecities的每一行都做。

查詢的結果是更新somecities

Name - State - Country - Info1 - Info2 
Orlando - FL - US  - 123 - AAA 
Orlando - KY - US  - 456 - AAA 
Orlando - WV - US  - 789 - AAA 
Orlando - SW - SA  - 333 - AAA 
Hrodna - HV - BY  - 890 - BBB 

附:如您所見,Info2中的值取自Info2中同一城市的值。

它可以在一個查詢中完成嗎?兩個查詢作爲答案也將被接受。

我解釋清楚了嗎?

謝謝。

+0

你會想要使用不存在,我會敲SQL提琴的例子 – twoleggedhorse

+0

這聽起來像你想'INSERT''而不是''更新''somecities''表。你想以任何方式改變現有的行嗎? – acfrancis

+0

你是對的。謝謝你指出。是的,現有的行不會更改。所以我想通過插入幾行來更新somecities表。 – Haradzieniec

回答

2

你需要一個INSERT查詢,你可以使用這樣的事情:

INSERT INTO somecities 
SELECT a.*, si.Info2 
FROM 
    allcities a LEFT JOIN somecities s 
    ON a.Name=s.Name AND a.State=s.State AND a.Country=s.Country 
    INNER JOIN (SELECT DISTINCT Name, Info2 
       FROM somecities) si 
    ON a.Name=si.Name 
WHERE 
    s.Name IS NULL 

請參閱小提琴here

這將插入allcities中不存在於somecities中(或具有相同名稱但不同狀態或國家)的所有行,因爲我使用了LEFT JOIN和WHERE s.Name IS NULL。

然後,我選擇城市的名稱和InfoC2列在somecities中存在,我只是在名稱上進行INNER JOIN,以便只返回存在於某些城市中的行至少一次。

+0

看起來像它的工作(只做了幾個測試,沒有發現錯誤)。如果有人發現任何錯誤,請在這裏告訴我。無論如何,你已經度過了我的一天。非常感謝你。您是如何在不到一週的時間內創建此查詢的? :) 謝謝。 – Haradzieniec

1

您可以使用NOT EXISTS來測試已經不在你的表中的記錄,然後做一個快速的加入來從現有的記錄INFO2:

SQL Fiddle demo

INSERT INTO somecities (Name,State,Country,Info1, Info2) 
SELECT data.Name,data.State,data.Country,data.Info1,inf.Info2 
FROM (
    SELECT * 
    FROM allcities a 
    WHERE NOT EXISTS (SELECT * 
         FROM somecities s 
         WHERE s.name = a.name 
          AND s.state = a.state 
          AND s.country = a.country 
          AND s.info1 = a.info1 
        ) 
) data 
    INNER JOIN (SELECT DISTINCT Name, Info2 FROM somecities) inf 
    ON data.name = inf.name; 

我個人覺得更容易閱讀EXISTSNOT EXISTS而不是大量的加入,但這是個人喜好,請選擇。

+0

也適用! – Haradzieniec

相關問題