2011-04-21 74 views
0

使用一種連接類型,返回2010年11月1日之後創建的客戶記錄的名字,姓氏,訂單號。僅當客戶已下達任何訂單時纔在第三列中包含訂單號。這個SQL查詢是否正確?我正在使用左外部連接

SELECT c.firstname, 
      c.lastname, 
      o.ordernumber 
    FROM Customers c 
LEFT JOIN Orders o ON c.customerid = o.customerid 
    WHERE o.orderdate > '2010-01-01' 
     AND o.ordernumber IS NOT NULL 
+3

請注意,2010年11月1日不是上面寫的'2010-01-01'。 – 2011-04-21 05:08:33

+0

@Bryan:+ 1,尼斯找到了。 – 2011-04-21 05:09:52

+0

你說過:'2010年11月1日以後創建的客戶記錄',但在你的查詢中,你正在檢查'Orders.OrderDate'列(對於不同的日期,因爲Bryan整齊地觀察到)。該專欄是否與創建客戶記錄真正相關?或者「創建客戶記錄」的含義實際上是什麼? – 2011-04-21 07:38:48

回答

1

這與Inner Join相同。例如:

SELECT c.firstname, 
c.lastname, 
o.ordernumber FROM Customers c 
Inner JOIN Orders o 
ON  c.customerid = o.customerid 
where o. orderdate > '01-01-2010' 

應該返回相同的結果。無論是否有相應的ORDER記錄,當您要返回CUSTOMER時使用LEFT JOIN。如果您只希望擁有訂單的客戶只需使用INNER JOIN

正如@Bryan指出的那樣,您可能需要考慮將日期轉換爲符合您的格式。 This link顯示瞭如何根據格式將varchar轉換爲日期時間。

0

LEFT OUTER JOIN將導致Customer表中每行的一行。這可以在wiki article中看到更好。使用INNER JOIN將僅返回具有相應訂單的客戶的行。

0

沒有測試這個,我認爲你不需要「和ordernumber不爲空」。

最終你會用:

FirstName| LastName| OrderNumber 
John  Smith  1 
John  Smith  2 
Joe  Bloggs NULL  <-- Joe has no orders 

你所說的「告訴我每個人都和他們的訂單如果有人沒有任何訂單,讓他們無論如何。」

0

這是如果沒有訂單,則WHERE條件將評估爲false,因此沒有訂單的客戶將不會被包含(我假設您希望所有客戶,因爲您寫下了「僅在該客戶有第三列時才包括訂單號」放置任何訂單「,所以使用INNER JOIN作爲其他人的建議將是不正確的)。

您可能想要刪除o.ordernumber IS NOT NULL條件。

0

如果「客戶記錄」你真的意味着「客戶訂單」,那麼也許您的查詢應該是這樣的:

SELECT c.firstname, 
      c.lastname, 
      o.ordernumber 
    FROM Customers c 
LEFT JOIN Orders o ON c.customerid = o.customerid 
     AND o.orderdate > '2010-01-01' 
        /* or '2010-11-01', if you want Nov 1, 2010 */ 

這將輸出所有的客戶。第三列將包含NULL或訂單號。

請記住,如果客戶在給定日期後有多個訂單,他/她的名字將相應地出現在列表中多次,每次都有不同的訂單號。