2012-06-11 69 views
3

對不起,如果標題不清楚。基本上我試圖從多個表中選擇某些記錄,然後更新返回記錄的某個列值。Teradata從Select語句更新表

T-SQL實現

UPDATE 
     CUSTOMERS 
    SET 
     LIKES_US = 'Y' 
    FROM 
     RESTAURANT REST INNER JOIN CUSTOMERS CUST ON REST.LINK_ID = CUST.LINK_ID 
     WHERE 
     REST.REST_TYPE = 'Diner' AND CUST.LIKES_US IS NULL 

甲骨文

UPDATE 
     (SELECT CUST.LIKES_US 
     FROM CUSTOMERS CUST INNER JOIN RESTAURANT REST ON CUST.LINK_ID=REST.LINK_ID 
     WHERE REST.REST_TYPE = 'Diner' AND CUST.LIKES_US IS NULL) NEW_CUST 
    SET 
     NEW_CUST.LIKES_US = 'Y'; 

我試圖做同樣的事情在Teradata的,因爲我在Oracle中沒有,但我得到以下錯誤:

Executed as Single statement. Failed [3707 : 42000] Syntax error, expected something like a name or a Unicode delimited identifier or an 'UDFCALLNAME' keyword between the 'UPDATE' keyword and '('. 
Elapsed time = 00:00:00.003 

STATEMENT 1: Unknown failed. 

我在網上尋找解決方案,但沒有運氣。

回答

9

您是否嘗試過和Teradata的語法如下:

UPDATE CUSTOMERS C1 
    FROM (SELECT C2.LINK_ID 
      FROM CUSTOMERS C2 
     INNER JOIN RESTAURANTS R2 
      ON C2.LINK_ID = R2.LINK_ID 
     WHERE R2.REST_TYPE = 'DINER' 
      AND C2.LIKES_US IS NULL) D1 
    SET LIKES_US = 'Y' 
WHERE C1.LINK_ID = C2.LINK_ID 
1

我認爲,在這種特定情況下,下面的查詢會表現得更好一點,因爲它需要一個較少的加入。

UPDATE C 
FROM CUSTOMERS C, RESTAURANTS R 
SET LIKES_US = 'Y' 
WHERE 
C.LINK_ID = R.LINK_ID 
AND R.REST_TYPE = 'DINER' 
AND C.LIKES_US IS NULL