2016-07-22 98 views
3

我被要求將我們的一些SQL字段更新爲更現代的單一術語。所以現在我正在將2列合併爲一個新值並將該新值輸入到另一個表中。我知道我想讓老人現在平等,我只是不確定如何使用更少的詞彙和正確的術語來知道如何尋求幫助。列A和列B等於表2中列C的新值

最初設計這個數據庫的人使事情比它應該更復雜。因此使得有些事情很難理解和領悟......

試圖解釋。目前,我與來自TABLE1數據工作,將其轉換成新的值將進入TABLE2

UDATE:我本來造成我的表錯

TABLE1          TABLE2 
+---------+---------+---------+   +---------+---------+ 
| ID | A  | B |   | ID | C | 
+---------+---------+---------+   +---------+---------+ 
| 01 | DESCRPT1| STRIPED |   | 01 | ZEBRA | 
+---------+---------+---------+   +---------+---------+ 
| 01 | DESCRPT2| HORSE |   | 02 | SNAKE | 
+---------+---------+---------+   +---------+---------+ 
| 02 | DESCRPT1| SLIMEY |    
+---------+---------+---------+     
| 02 | DESCRPT2| ROPE |    
+---------+---------+---------+ 

From TABLE1 
If Value DESCRPT1 is 'Striped' and DESCIRP2 is 'Horse' 
THEN insert 'Zebra' into TABLE2 column C where TABLE1.ID = TABLE2.ID 
If Value DESCRPT1 is 'Slimey' and DESCIRP2 is 'Rope' 
THEN insert 'Snake' into TABLE2 column C where TABLE1.ID = TABLE2.ID 

注:這是我在這裏的第一篇文章,所以如果我丟失任何信息,或者這樣做不對。對不起:(

UPDATE

tblEngagementAttributes      tblEngagement 
+---------+---------+---------+   +---------+---------+---------+ 
| ID | A  | B |   | ID | Client | C | 
+---------+---------+---------+   +---------+---------+---------+ 
| 01 | DESCRPT1| STRIPED |   | 01 | John | ZEBRA | 
+---------+---------+---------+   +---------+---------+---------+ 
| 01 | DESCRPT2| HORSE |   | 02 | Mark | SNAKE | 
+---------+---------+---------+   +---------+---------+---------+ 
| 02 | DESCRPT1| SLIMEY |    
+---------+---------+---------+     
| 02 | DESCRPT2| ROPE |    
+---------+---------+---------+ 

是我發現可能會幫助有益的那麼一點點更多的信息,想出解決辦法..,我翻譯的數據到表已經是一個現有的表。這兩個表有一個共同的外鍵「ID」

+1

SQL是一種關係型數據庫,這意味着它是在利用關係真的很好在表格中的數據之間。爲了解決您的問題,理想情況下您希望已經計算出'TABLE2'。 –

+1

歡迎來到stackoverflow。對於你的第一個問題,寫得很好,別擔心。 –

+0

我才意識到我提出我的問題錯了.. – Megan

回答

2

可以使用INSERT INTO ... SELECT結構,以達到你想要的東西。我想在這裏指出的技巧是使用一個WHERE子句TABLE1限制到只記錄你肯定會想要這樣做rt以某種形式。如果您省略了WHERE子句,則查詢仍然會運行,但是您將爲TABLE1中的任何記錄添加虛擬記錄,這些記錄您不想映射到TABLE2

INSERT INTO TABLE2 (ID, C) 
SELECT ID, 
     CASE WHEN A = 'STRIPED' AND B = 'HORSE' THEN 'ZEBRA' 
      WHEN A = 'SLIMEY' AND B = 'ROPE' THEN 'SNAKE' 
      ELSE '' 
     END 
FROM TABLE1 
WHERE A = 'STRIPED' AND B = 'HORSE' OR 
     A = 'SLIMEY' AND B = 'ROPE' 

更新:

我給上面的回答你原來的問題,你改變它。試試下面的查詢更新的問題:

INSERT INTO TABLE2 (ID, C) 
SELECT t.ID, 
     CASE WHEN t.ZebraCol >= 2 THEN 'ZEBRA' 
      WHEN t.SnakeCol >= 2 THEN 'SNAKE' 
      ELSE '' 
     END AS C 
FROM 
(
    SELECT ID, 
      SUM(CASE WHEN (A = 'DESCRPT1' AND B = 'STRIPED') OR 
         (A = 'DESCRPT2' AND B = 'HORSE') THEN 1 ELSE 0 END) AS ZebraCol, 
      SUM(CASE WHEN (A = 'DESCRPT1' AND B = 'SLIMEY') OR 
         (A = 'DESCRPT2' AND B = 'ROPE') THEN 1 ELSE 0 END) AS SnakeCol 
    FROM TABLE1 
    GROUP BY ID 
) t 
WHERE t.ZebraCol >= 2 OR t.SnakeCol >= 2 
+0

垃圾。我只是意識到我描述我的表錯了 – Megan

+1

@Megan不用擔心。更新你的問題,我們將嘗試再次回答。 –

+0

以防萬一。如果您已經使用'WHERE'過濾,則不需要'ELSE'部分。也要小心你的常數。 '「條紋」 <>「STRIPED'' –

0

你需要使用CASE聲明,我從來沒有與INSERT完成之前,但是這應該是一個很好的起點:

INSERT into table2(id, c) 
    SELECT id, 
      CASE WHEN table1.a = 'STRIPED' AND table1.b = 'HORSE' THEN 'ZEBRA' 
      CASE WHEN table1.a = 'SLIMEY' AND table1.b = 'ROPE' THEN 'SNAKE' 
      ELSE '' 
      END 
FROM table1 
WHERE a = 'STRIPED' AND B = 'HORSE' OR 
     a = 'SLIMEY' AND B = 'ROPE' 

給它一個去。

蒂姆擊敗了我。

+0

我搞砸了我的第一篇文章。這將是完美的,但不幸的是,描述是在多行而不是列上輸入的。 所以,我有兩個(或更多一些實例)用於每ID的描述的線。沒有爲每個描述列。 – Megan

0

我想你會有更多的動物比ZEBRASNAKE,所以會提出更通用的解決方案。首先你創建一個附加表來存儲描述符給每個動物的內容。這允許您添加或更改說明而不影響您的查詢。

CREATE TABLE WHAT_IS 
    (`W_ID` int, `D1` varchar(7), `D2` varchar(5), `IS_A` varchar(5)) 
; 

INSERT INTO WHAT_IS 
    (`W_ID`, `D1`, `D2`, `IS_A`) 
VALUES 
    (1, 'STRIPED', 'HORSE', 'ZEBRA'), 
    (2, 'SLIMEY', 'ROPE', 'SNAKE') 
; 

SQL Fiddle DEMO:此假設每個ID只有一個'DESCRPT1'和一個'DESCRPT2'

INSERT INTO Table2 (`ID`, `C`) 
SELECT T.`ID`, W.`IS_A` as `C` 
FROM (
     SELECT `ID`, 
       MAX(CASE WHEN `A` = 'DESCRPT1' THEN `B` END) as D1, 
       MAX(CASE WHEN `A` = 'DESCRPT2' THEN `B` END) as D2 
     FROM Table1 t 
     GROUP BY `ID` 
    ) T 
JOIN WHAT_IS W 
    ON T.`D1` = W.`D1` 
AND T.`D2` = W.`D2` 

輸出

| ID |  C | 
|----|-------| 
| 1 | ZEBRA | 
| 2 | SNAKE | 
相關問題