2013-06-19 49 views
0

我有兩個表TableATableBTableATableB都包含以下列:namemember_idTableB當前包含member_id的「正確」值,而TableA沒有。用LIKE寫一個UPDATE查詢

我希望做的是在TableBmember_id列遷移所有值在TableA相應列(由值列name列進行匹配)。但是,有時這兩個表格中的名稱的輸入方式稍有不同。

我寫了下面這個SQL查詢,雖然WHEN EXISTS下的子查詢不正確。有人可以幫助我嗎?謝謝。

UPDATE TableA 
SET member_id = 
CASE 
    WHEN EXISTS 
    (SELECT member_id 
    FROM TableB 
    WHERE TableB.name ILIKE '%' || 'TableA.name' || '%' 
    LIMIT 1) 

    THEN member_id 

    ELSE '1' 
END 
WHERE 
TableA.member_id = '0' 

另外,我將其設置使得當是member_id未知的,它被設置爲0。ELSE '1' cluase是將0更新到1中的member_id列,以便我知道查詢運行和改性該行已經。

澄清:我希望設置TableA.member_id = TableB.member_id其中TableA.name類似於TableB.name0和1用於調試,而不是最終目標。

+0

首先,'TableA.name'不應該加引號。 – Tomalak

回答

1

您有TABLEA.NAME的報價。刪除:

UPDATE TableA 
    SET member_id = (CASE WHEN EXISTS (SELECT member_id 
             FROM TableB 
             WHERE TableB.name ILIKE '%' || TableA.name || '%' 
            ) 

          THEN member_id 
          ELSE '1' 
        END) 
    WHERE TableA.member_id = '0' 

此外,LIMIT 1是沒有必要的,因爲你是檢查是否存在。

而且,您可以在狀態轉移到where條款,明確邏輯(在我看來):

UPDATE TableA 
    SET member_id = '1' 
    WHERE TableA.member_id = '0' and 
      exists (SELECT member_id 
        FROM TableB 
        WHERE TableB.name ILIKE '%' || TableA.name || '%' 
       ) 

編輯(在響應評論)

這裏得到的一種方式會員ID。這種方法取得了最大的價值。通過使用聚合函數,查詢可以使用coalesce()在聚集提供一個未知值:

UPDATE TableA 
    SET member_id = (SELECT coalesce(max(member_id), 'Unknown') 
        FROM TableB 
        WHERE TableB.name ILIKE '%' || TableA.name || '%' 
        ) 
    WHERE TableA.member_id = '0'; 

最後,你可以寫這個使用join語法:

UPDATE TableA 
    SET TableA.member_id = TableB.member_id 
    FROM TableB 
    WHERE TableB.name ILIKE '%' || TableA.name || '%' and 
      TableA.member_id = '0' 

如果有多個匹配,那麼查詢將選擇一個任意的。

+0

謝謝,澄清,我希望設置TableA.member_id = TableB.member_id其中TableA.name類似於TableB.name。 0和1是要調試的,而不是最終目標。 –

0

無需備選策略爲like

UPDATE TableA dst 
SET member_id = COALESCE (src.member_id, -1) 
FROM (
     SELECT a.name , b.member_id 
     FROM TableA a 
     LEFT JOIN TableB b ON POSITION (b.name IN a.name) > 0 
     ) src 
WHERE dst.name = src.name 
AND dst.member_id < 10 
     ; 

注:我改變member_id從字符的數字,這讓我更有意義。

測試數據:

CREATE TABLE TableA (member_id INTEGER , name varchar); 
CREATE TABLE TableB (member_id INTEGER , name varchar); 

INSERT INTO TableA(member_id,name) VALUES 
(0, 'Jack'), (1, 'Jill'), (2 , 'Bob'), (3, 'Alice'); 
INSERT INTO TableB(member_id,name) VALUES 
(11, 'ack'), (12, 'ill'), (13 , 'Do'), (14, 'lic'); 

結果:

member_id | name 
-----------+------- 
     11 | Jack 
     12 | Jill 
     -1 | Bob 
     14 | Alice