2015-07-02 11 views
0

表A(沒有什麼是獨特的)如何合併兩個SQL表,其中B是A的子集,並且應該重寫A?

╔══════╦══════╦═══════════╦═══════════════╗ 
║ p_id ║ l_id ║ p_name ║ p_description ║ 
╠══════╬══════╬═══════════╬═══════════════╣ 
║ 212 ║ 1 ║ Ball  ║ Red   ║ 
║ 212 ║ 2 ║ Balle  ║ Rouge   ║ 
║ 301 ║ 1 ║ Horn name ║ Blue   ║ 
╚══════╩══════╩═══════════╩═══════════════╝ 

表B(P_ID是唯一的)

╔══════╗ 
║ p_id ║ 
╠══════╣ 
║ 101 ║ 
║ 201 ║ 
║ 210 ║ 
║ 212 ║ 
║ 234 ║ 
║ 250 ║ 
║ 301 ║ 
║ 320 ║ 
╚══════╝ 

WRT P_ID,表A是表B(所有P_ID應在表B中存在的話)的一個子集但表A包含不同的數據。這兩個表格都包含更多不顯示的列。對於表A,我只關心p_id。對於表B,我想根據l_id消除重複項。總會有一個l_id爲1的條目,但可能有或者可能沒有應該被丟棄的條目(例如,一個簡單的WHERE l_id = 1應該這樣做)。

的結果應該是有表A行的大多數的每列將在與其他列中沒有數據表B(一次)的每一個的p_id表,因爲他們沒有在表中存在B.所以我應該有這種情況,例如:

╔══════╦══════╦═══════════╦═══════════════╗ 
║ p_id ║ l_id ║ p_name ║ p_description ║ 
╠══════╬══════╬═══════════╬═══════════════╣ 
║ 101 ║  ║   ║    ║ 
║ 201 ║  ║   ║    ║ 
║ 210 ║  ║   ║    ║ 
║ 212 ║ 1 ║ Ball  ║ Red   ║ 
║ 234 ║  ║   ║    ║ 
║ 250 ║  ║   ║    ║ 
║ 301 ║ 1 ║ Horn name ║ Blue   ║ 
║ 320 ║  ║   ║    ║ 
╚══════╩══════╩═══════════╩═══════════════╝ 

回答

1

從您的描述,這聽起來像一個left join

select b.p_id, a.l_id, a.p_name, a.p_description 
from b left join 
    a 
    on b.p_id = a.p_id and a.l_id = 1; 
+0

我覺得你的代碼的輸出將只是2行,而他需要8行。 **編輯:**你的情況是'b.p_id = a.p_id和a.l_id = 1',那我想是的。 –

+0

@stack。 。 。你爲什麼那麼想?它會返回'b'中的所有行,我認爲其中有八個。 –

+0

我知道你是正確的*(代表你的代表人數)*,但我不知道爲什麼?!看,當你使用'join'時,'on'有一個條件。現在只有兩行在你的情況下是真的。讓我問一件事。發生了什麼如果我在連接中改變'a'和'b'的位置?!像這樣:'從左連接b' –

1

要想從一個表中的所有行,並從另一個你可以選配一些條件的行請使用left join

select b.p_id, a.l_id, a.p_name, a.p_description 
from b 
left join a on b.p_id = a.p_id and a.l_id = 1 

這將使您從B中獲得與A中與列條件相匹配的值的所有值。對於B中沒有任何匹配的那些行,您將獲得null值。

相關問題