2014-11-21 42 views
1

我在SQLITE意外LEFT OUTER JOIN行爲SQLite中

兩個表

「端口」 是

ticker weight 
abc  1 
bcd  2 
cde  3 

「bench2」 是

ticker weight 
abc  3 
bcd  2 
cde  1 

和我試着去學習如何使用SQLITE中的外連接。 JOIN用LEFT OUTER開始如下

SELECT * FROM port LEFT OUTER JOIN bench2 ON port.ticker = bench2.ticker; 

我得到的結果

ticker weight ticker weight 
abc  3  NULL NULL 
bcd  2  bcd  2 

時,我希望看到

ticker weight weight 
abc  1  3 
bcd  2  2 
cde  3  1 

什麼我做錯了,我會怎麼弄我想要的結果?如果可能的話

第二個問題 - 我怎麼能拿的

ticker weight weight 
abc  1  3 
bcd  2  2 
cde  3  1 
def  NULL 3 

額外行的結果表,如果「bench2」有一個額外的行,

ticker weight 
abc  3 
bcd  2 
cde  1 
def  3 

port保持不變。

+2

修復問題,使表和列名始終貫穿始終。 – 2014-11-21 14:24:04

+1

你應該在你的結果中得到兩個'ticker'和兩個'weight'列,但是如果你確實得到了你用數據描述的結果行並且查詢了你的結果,那麼SQLite會出現一些錯誤。我更傾向於認爲你的數據與你說的不同,或者你可能已經執行了不同的查詢。 – 2014-11-21 14:34:28

+1

http://sqlfiddle.com/#!5/de483/1 – Wiseguy 2014-11-21 14:41:14

回答

2

對您的結果進行逆向工程使我得出結論:您的數據與您所說的不同。您似乎是這樣的:

端口:

ticker weight 
abc  3 
bcd  2 
... (no other rows) 

bench2:

ticker weight 
bcd  2 
... maybe other rows, but none having ticker = 'abc' 

至於列,當你執行任何加入比NATURAL JOIN另一方面,則是爲每一個結果列每個連接表中的列,包括具有相同名稱的列,並且包括出現在連接條件中的列。您可以限制哪些列出現在最終查詢結果中,並且/或者您可以爲其指定首選別名,方法是在選擇列表中指定要使用的別名。

-1

這樣的事情呢?

SELECT table2.ticker, 
     table1.weight, 
     table2.weight 
FROM table2 
     LEFT OUTER JOIN table1 
        ON table1.ticker = table2.ticker 
+0

主要問題不是結果中有哪些列,而是哪些*行*。 – 2014-11-21 14:35:57

+0

我相信這個答案中的查詢給出了當時問題中預期的輸出。只要表格中的數據是當時所說的數據。如果不是您需要的,我很抱歉。 – vsj 2014-11-21 14:47:05

+0

在這個答案的查詢相當於一個問題中,除了選擇的結果列的子集。凡在問題提出的詢問真的有生產描述的結果,在這個答案*查詢不會*產生預期的結果,因爲**列選擇不是主要問題**。查看哪些行被返回,以及每個行中都包含哪些行。 – 2014-11-21 14:58:17