Select
無法根據條件選擇生成表格
我想實現一些可能以某種條件選擇(MS SQL)結束的東西,但我不知道如何去做。
我試圖將我的問題簡化為以下描述:
我有 3 個表:1 個包含文章(Art_number、Art_description 和 Productgroup),第二個包含客戶(Cust_number 和 Cust_name),第三個表包含折扣資訊(Cust_number、Productgroup 和 Discount_percentage)
表:項目
001,fork,cutlery 002,knife,cutlery 003,plate,tableware 004,cup,tableware
表:客戶
1234,smith 5678,jones
表:折扣
1234,cutlery,0.9 1234,tableware,0.8 5678,cutlery,0.75 5678,tableware,0.7
我的問題是與第 4 個表的關係,該表包含一些(不是全部!)名為 Cross_Ref 的替代(客戶相關)文章編號,它通過包含文章編號和客戶編號(Art_number、Alt_Art_Nr 和 Customer_Nr)連結前兩個表
表:Cross_Ref
002,1002,1234 002,92002,5678 004,1004,1234 004,92004,5678
我想生成一個表格,在第一列中顯示文章編號,在第二列中顯示文章描述。第三列中的替代貨品編號(如果可用,否則為空)和第四列中的客戶名稱
上面的資訊應該是這樣的:
001,fork,,smith 001,fork,,jones 002,knife,1002,smith 002,knife,92002,jones 003,plate,,smith 003,plate,,jones 004,cup,1004,smith 004,cup,92004,jones
我的查詢目前如下所示:
SELECT Art_number, Art_description, Alt_Art_Nr, Cust_name FROM Articles, Customer, Cross_Ref WHERE Articles.Art_number = Cross_Ref.Art_number and Customer.Cust_number = Cross_Ref.Customer_Nr and Customer.Cust_number = Discounts.Cust_number and Articles.Productgroup = Discounts.Productgroup
這僅向我顯示那些確實具有替代文章編號的行,但不顯示沒有在 Cross_Ref 表中提到的參考的文章。
原則上它是由 3 個表完全連接的 4 個表的組合,但第 4 個表僅包含一些文章(具有替代編號),因此在查詢結果中只包含那些文章編號,而我會喜歡查看所有文章編號和空(NULL)欄位,如果沒有結果。
任何人都可以告訴我一個如何存檔的例子嗎?
根據輸出,我認為您需要以下類型的查詢:
FROM (Base) LEFT JOIN Cross_Ref ON (Base columns) = (Cross_Ref columns)
如果沒有關於該表的更多資訊
Discount
,我們無法確定,但(Base)
可能應該是(兩個表的笛卡爾積):Articles CROSS JOIN Customers
或(使用另一個中間表的連接,即):
Articles JOIN Discount (ON ...) JOIN Customers (ON ...)
所以,最終的查詢應該類似於:
SELECT a.Art_number, a.Art_description, ref.Alt_Art_Nr, c.Cust_name FROM Articles AS a CROSS JOIN Customers AS c LEFT JOIN Cross_Ref AS ref ON a.Art_number = ref.Art_number AND c.Cust_number = ref.Customer_Nr ;
要麼:
SELECT a.Art_number, a.Art_description, ref.Alt_Art_Nr, c.Cust_name FROM Articles AS a JOIN Discount AS d ON a.Productgroup = d.Productgroup JOIN Customers AS c ON c.Cust_number = d.Cust_number LEFT JOIN Cross_Ref AS ref ON a.Art_number = ref.Art_number AND c.Cust_number = ref.Customer_Nr ;