2014-12-01 71 views
0

我創建了一個數據庫在ms sql中,在數據庫中我有三類人員,即我存儲在不同表中的員工,客戶,供應商爲每個人創建序列唯一標識。從表中選擇與人的類別

現在這些人的ID存儲在爲person_id和存儲無論是在交易表的工作人員,custimer或供應商的列名的人型,問題在於從交易表中選擇這樣的僞代碼記錄

Select t.*,s.na as staff,sp.name as supplier, c.name as customer 
From Trans t 
left join Staff s on s.id = t.pid 
left join Suppliers sp on sp.id = t.pid 
left join Customers c on c.id = t.pid 

這將返回一個排,而不是至少3個或更多,我該如何解決這個問題

我跨表

person_id Person_type Trans_id 
1   staff   1 
1   customer   2 
2   customer   3 
3   suppler   4 
1   staff   5 

預計輸出

person_name  Trans_id 
james   1 
mark    2 
dan    3 
jude    4 
james   5 

員工,客戶和供應商都存儲在各自不同的表

+1

您能否提供樣品數據和預期結果? – sgeddes 2014-12-01 18:25:52

+0

@sgeddes我添加了更多信息 – Smith 2014-12-01 21:00:35

+0

在事務表上執行左連接返回該表的所有行。你提供的僞查詢應該做你想要的。如果沒有,那麼在你給我們的描述中就會失蹤。 – 2014-12-01 21:14:02

回答

1

那就是加入確實,從多個表中的數據組合成一個結果行的內容。如果你想「保持行」,而不是將它們組合起來,你可以使用UNION

(
    Select t.* From Trans t 
    left join Staff s on s.id = t.pid 
) 
UNION 
(
    Select t.* From Trans t 
    left join Suppliers sp on sp.id = t.pid 
) 
UNION 
(
    Select t.* From Trans t 
    left join Customers c on c.id = t.pid  
) 

這會得到你想要的多行,但是仍然不知道你已經正確定義它。我看到你只是從Trans中獲取列,所以你沒有從其他表中獲取任何數據。而且你正在做外部連接,所以其他表格不會影響選擇。所以我認爲這與從Trans中選擇一樣。

如果你想要的是來自Trans的數據,其他表中有對應的條目,那麼做UNION,但也要將外部連接改爲inner。

+0

我得到這個錯誤'所有使用聯合,INTERSECT或EXCEPT操作符組合的查詢必須在其目標列表中具有相同數量的表達式。「# – Smith 2014-12-02 17:59:25

+1

@Smith,我輸入的查詢不認爲會給你。所以聽起來你已經添加了其他表的列,這是很好的,但是每個UNIONed集的列都必須具有相同數量的列和類型。檢查是否屬實,如果沒有看到你是否可以粘貼你的SQL(也許在你的問題中是「第二次嘗試」),我會看看。 – asantaballa 2014-12-02 18:10:35

+0

謝謝我是ablr,以確保每個查詢輸出的所有列具有相同的名稱 – Smith 2014-12-02 18:16:29