2016-08-09 62 views
1

由於我執行的左連接有時不會傳遞結果,因此我的「第一個」表的ID設置爲0.我現在想要選擇ID兩次,並使該副本不可變,以便即使在聯接失敗時仍可以訪問它。選擇相同的行兩次,並使複製不可變

這裏是我的查詢:

SELECT * FROM table1 
LEFT JOIN table2 ON table1.ID = table2.ID 
LEFT JOIN table3 ON table1.ID = table3.ID 

每行table1中只有在任一表2表3或相同的ID,因此,對於每一行,兩個中的一個連接將「失敗」。以下是我得到的結果(模擬結果):

+------+------------+------------+------------+------------+------------+------------+ 
| ID | Table1Col1 | Table1Col2 | Table2Col1 | Table2Col2 | Table3Col1 | Table3Col2 | 
+------+------------+------------+------------+------------+------------+------------+ 
| NULL | Something | Something | NULL  | NULL  | Something | Something | 
| NULL | SomeValue | SomeValue | Something | Something | NULL  | NULL  | 
+------+------------+------------+------------+------------+------------+------------+ 

我想實現的目標:使「ID」不爲NULL。

(另外,選擇「table1.ID作爲身份識別碼,*」給了我一個SQL錯誤)

(顯式地選擇價值是毫無疑問的設計原因)

+0

您可以包括哪些錯誤? –

+0

我認爲「不可變」不是正確的詞,因爲'*'只會提供一個ID字段,這可能是錯誤的。給出錯誤信息會有幫助。 – Jakumi

回答

2

下面的查詢應該工作,命名字段明確...

SELECT table1.ID, table1.Table1Col1, table1.Table1Col2, 
     table2.Table2Col1, table2.Table2Col2, 
     table3.Table3Col1, Table3.Table3Col2 
FROM table1 
LEFT JOIN table2 ON (table1.ID=table2.ID) 
LEFT JOIN table3 ON (table1.ID=table3.ID) 

更新通配符:你必須提供一個表時*不是唯一的選擇「colu MN」。

SELECT table1.ID as MyID, table1.*, table2.*, table3.* 
FROM table1 
LEFT JOIN table2 ON (table1.ID=table2.ID) 
LEFT JOIN table3 ON (table1.ID=table3.ID) 

要小心,即相同的列將以這種方式出現多次,因此無論結果應該可能期待什麼過程。例如在PHP中,我相信最後一個值會贏(如果以columnname訪問)。

+0

是的,如果我可以明確地命名它,那就是。我忘了在我的文章中提到,但未來的網絡管理員應該能夠添加表或列而不必更改查詢代碼。 (這可能聽起來有點不可思議,但使用'*'時它的工作原理完全沒問題) – user2065501

+0

好吧,它不能正常工作,或者你不會問這個問題? ^^。請嘗試重命名時發佈錯誤消息。 – Jakumi

+0

呃,我的意思是一切,但是,你是對的:P。如果這意味着什麼,我會發布錯誤。我只會得到'你的SQL語法在* FROM ...「附近有一個錯誤。或者我太愚蠢,無法正確使用MySQL。我不知道。 – user2065501

相關問題