3

有沒有什麼辦法可以避免內部連接從客戶表中獲取客戶名和姓,以及如何優化執行計劃?如何避免額外的內部連接來優化此查詢?

SELECT c1.firstname, c1.lastname, t.* 
FROM customer c1 
INNER JOIN 
    (select c.Customerid ,count(si.CustomerID) as 'No Of Orders' 
    from Customer c 
    LEFT OUTER join SalesInvoice si ON si.CustomerID = c.CustomerID 
    GROUP by c.CustomerID) as t 
ON c1.CustomerID = t.Customerid 

enter image description here

+0

爲什麼你認爲INNER JOIN是一件壞事?此查詢更好,然後按名字,姓氏進行分組。 COUNT()OVER()應該和你的一樣好。如果你的目的是簡潔的,我會做Customer LEFT JOIN(從SalesInvoice GROUP BY CustomerID中選擇CustomerID,count(*)cnt)。 – Alsin 2013-03-25 08:48:06

回答

2

有兩種方法可以做到這一點。 一種方式是通過列表如下,以包括所有非聚合列入組:

SELECT 
    c.firstname, 
    c.lastname, 
    c.CustomerId, 
    count(si.CustomerID) as 'No Of Orders' 
FROM 
    customer c 
LEFT OUTER JOIN 
    SalesInvoice si ON si.CustomerID = c.CustomerID 
GROUP BY 
    c.CustomerID, 
    c.firstname, 
    c.lastname 

另一種方法來做到這一點,將在選擇列表中使用集合函數(MIN或MAX應該做的) :

SELECT 
    MIN(c.firstname) as firstname, 
    MIN(c.lastname) as lastname, 
    c.CustomerId, 
    count(si.CustomerID) as 'No Of Orders' 
FROM 
    customer c 
LEFT OUTER JOIN 
    SalesInvoice si ON si.CustomerID = c.CustomerID 
GROUP BY 
    c.CustomerID 

我覺得第一個查詢在性能上可能會更好。爲了提高整體表現,您需要創建一個包含或覆蓋索引。

你可以看看以下鏈接給你列入索引的想法:

  1. Why use the INCLUDE clause when creating an index?
  2. http://msdn.microsoft.com/en-IN/library/ms190806.aspx
0

嘗試一個:

SELECT 
    c.firstname, 
    c.lastname, 
    c.CustomerId, 
    count(si.CustomerID) as 'No Of Orders' 
FROM 
    customer c 
LEFT OUTER JOIN 
    SalesInvoice si ON si.CustomerID = c.CustomerID 
GROUP BY 
    c.CustomerID, 
    c.firstname, 
    c.lastname 
1

嘗試使用此選項與OVER()條款

SELECT c1.Customerid, c1.firstname, c1.lastname, 
     COUNT(si.CustomerID) OVER(PARTITION BY c1.CustomerID) AS 'No Of Orders' 
FROM customer c1 LEFT JOIN SalesInvoice si ON si.CustomerID = c1.CustomerID 

爲了提高性能,你需要這個指數

CREATE INDEX ix_Customerid_Customer ON Customer(Customerid) INCLUDE(firstname, lastname) 
+0

這將重複customerid,名字 – 2013-03-25 08:27:27

+0

@Vishwanath Dalvi在例子OP customerid,firstname repeat too;) – 2013-03-25 08:29:01