2012-09-10 84 views
0

我有一個MySQL表,其中包含多個表中的大量數據。因此,爲了全面瞭解,我認爲最好的選擇是使用UNION子句,但是我也想知道哪些表的結果來自於某些表具有多個值,有些表爲空。Mysql聯盟條款確定表

下面的SQL似乎不工作,但我不能看到什麼是錯的。

(SELECT *, `2` AS 'cat' from `2` where `recid` = 'cneta0ld00ah') 
    UNION 
(SELECT *, `3` AS 'cat' from `3` where `recid` = 'cneta0ld00ah') 
    UNION 
(SELECT *, `4` AS 'cat' from `4` where `recid` = 'cneta0ld00ah') 
    UNION 
(SELECT *, `5` AS 'cat' from `5` where `recid` = 'cneta0ld00ah') 

所有表看起來像下面的命名,1,2,3,4等

recid   | item 
------------------------- 
cneta0ld00ah | 1 
cneta0ld00ab | 1 
cneta0ld00ad | 3 

我不能導入來自一個非常古老的改變表的名稱作爲其數據庫,我們正試圖轉換和提取數據。

如果我運行它沒有「表名」 AS「貓」,那麼它運行良好,只要我嘗試在它拋出一個錯誤說

Unknown column '2' in 'field list' 

這似乎表名稱添加想到2是一個列名?

+0

是否有原因,爲什麼你使用'UNION'而不是'UNION ALL'? – Kermit

+0

Erm不,只是覺得UNION可能是要走的路。剛注意到UNION刪除重複的行,它可能每個表都會返回一個1的項目,我想知道這是否會返回1行。 ALL返回所有行?任何其他原因使用ALL? –

+0

'UNION'需要額外的時間去除重複。如果你只是需要合併數據而不重複,'UNION ALL'要快得多,因爲它不會刪除重複項。看到我的答案。 – Kermit

回答

3

問題是你在'餐桌'AS'貓'周圍有反光鏡。反引號用於引用表名和列名,而不是字符串。您應該使用單引號代替:

(SELECT *, '2' AS 'cat' from `2` where `recid` = 'cneta0ld00ah') 
    UNION 
(SELECT *, '3' AS 'cat' from `3` where `recid` = 'cneta0ld00ah') 
    UNION 
(SELECT *, '4' AS 'cat' from `4` where `recid` = 'cneta0ld00ah') 
    UNION 
(SELECT *, '5' AS 'cat' from `5` where `recid` = 'cneta0ld00ah') 
0

所有的表都有相同的結構嗎?在Union,與select *,他們需要。

如果是的話,儘量去掉括號

SELECT recid, item, `2` AS `cat` from `2` where `recid` = 'cneta0ld00ah' 
UNION 
SELECT recid, item, `3` AS `cat` from `3` where `recid` = 'cneta0ld00ah' 
+0

表2-5肯定會做,後面的一些不會在稍後的日子裏處理,但上面的那些做。 –

0

使用UNION ALL而不是UNION

(SELECT *, `2` AS 'cat' from `2` where `recid` = 'cneta0ld00ah') 
UNION ALL 
(SELECT *, `3` AS 'cat' from `3` where `recid` = 'cneta0ld00ah') 
UNION ALL 
(SELECT *, `4` AS 'cat' from `4` where `recid` = 'cneta0ld00ah') 
UNION ALL 
(SELECT *, `5` AS 'cat' from `5` where `recid` = 'cneta0ld00ah') 

UNION應該當您選擇相關的信息,類似於JOIN使用,因爲只有不同的值會被選中。 UNION ALL不刪除重複項,因此也減少了查找不同值所需的時間。

您還應該始終指定一個列列表,而不是SELECT *

+0

感謝UNION ALL肯定會對一些疑問有所幫助,但是我的特殊問題是由Ike指出的反引號解決的。 –