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

ここに画像の説明を入力してください

4

3 に答える 3

2

それを行うには2つの方法があります。1つの方法は、以下のように、すべての非集計列をgroupbyリストに含めることです。

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

これを行う別の方法は、選択リストで集計関数(最小または最大で実行する必要があります)を使用することです。

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. インデックスを作成するときにINCLUDE句を使用するのはなぜですか?
  2. http://msdn.microsoft.com/en-IN/library/ms190806.aspx
于 2013-03-25T08:23:38.220 に答える
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)
于 2013-03-25T08:21:19.807 に答える
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
于 2013-03-25T08:11:36.737 に答える