Select

無法根據條件選擇生成表格

  • February 19, 2014

我想實現一些可能以某種條件選擇(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 ;

引用自:https://dba.stackexchange.com/questions/59129