1

私の仕事はSQLServer2008を実行しており、仕事の副産物としてデータベースに情報を照会することに多くの時間を費やしています。データセットと同じ集計レベルではない情報が必要な場合は、selectステートメントで埋め込みクエリを使用します。通常、同じ番号の2つまたは3つのわずかに異なるバージョンであるため、両方とも同じテーブルにクエリを実行します。(以下の例を参照)

問題は、selectステートメントに埋め込まれたサブクエリのエイリアスのスコープは何ですか。私が考えた2つのオプションは次のとおりです。

  1. スクリプトレベルで、すべてのサブクエリとテーブルに固有である必要がありますか?
  2. サブクエリレベルで、それぞれで同じエイリアスを共有できます。

Fromステートメントでエイリアス化されたテーブルの場合、それらは一意である必要があります。行ごとにクエリが実行されていたので、状況が違うのではないかと思いました。

例(完全に構成されています。明らかなエラーがあればお知らせください。修正します):

スクリプトレベル-すべてのサブクエリとテーブルの一意のエイリアス:

Select
  p.purchaseid, p.purchasedate, 
  s.storename, c.customerid, 
(select count(p2.purchaseid) 
  from purchases p2 inner join 
       store s2 on p2.storeid = s2.storeid
  where s2.storeid = s.storeid
    and p2.purchasedate = p.purchasedate) as 'Store Daily Total Purchases',
(select count(p3.purchaseid) 
  from purchases p3 inner join 
       store s3 on p3.storeid = s3.storeid
  where p3.customerid = p.customerid
    and p3.purchasedate = p.purchasedate) as 'Customer Daily Total Purchases'
from 
  purchases p inner join   
  customer c on p.customerid = c.customerid
  store s on p.storeid = s.storeid

クエリレベル-サブクエリの一般的なエイリアスok:

Select
  p.purchaseid, p.purchasedate, 
  s.storename, c.customerid, 
(select count(p2.purchaseid) 
  from purchases p2 inner join 
       store s2 on p2.storeid = s2.storeid
where s2.storeid = s.storeid
  and p2.purchasedate = p.purchasedate) as 'Store Daily Total Purchases',
(select count(p2.purchaseid) 
  from purchases p2 inner join 
       store s2 on p2.storeid = s2.storeid
where p2.customerid = p.customerid
  and p2.purchasedate = p.purchasedate) as 'Customer Daily Total Purchases'
from 
  purchases p inner join   
  customer c on p.customerid = c.customerid
  store s on p.storeid = s.storeid
4

1 に答える 1

3

エイリアシングはクエリレベルで行われるため、2番目の例で問題ありません。

from句のテーブルを参照すると、そのトピックについて詳しく知りたい場合に備えて、これらの相関サブクエリが作成されます。

一般に、クエリをfrom句に移動し、結合として管理することをお勧めします。

Select p.purchaseid, p.purchasedate, s.storename, c.customerid,
       pdate.cnt as [Store Daily Total Purchases],
       pcust.cnt as [Customer Daily Total Purchases]
from purchases p inner join   
     customer c
     on p.customerid = c.customerid join
     store s on p.storeid = s.storeid left outer join
     (select s2.storeid, p2.purchasedate, count(p2.purchaseid) 
      from purchases p2 inner join 
           store s2 on p2.storeid = s2.storeid
      group by s2.storeid, p2.purchasedate
     ) pdate
     on pdate.purchasedate = p.purchasedate and
        pdate.storeid = s.storeid left outer join
     (select s2.customerid, p2.purchasedate, count(p2.purchaseid) 
      from purchases p2 inner join 
           store s2 on p2.storeid = s2.storeid
      group by s2.storeid, p2.purchasedate
     ) pcust
     on pcust.purchasedate = p.purchasedate and
        pcust.customerid= s.customerid

ただし、あなたの場合、集約を使用するだけのより簡単な解決策があると思います。

Select p.purchaseid, p.purchasedate, s.storename, c.customerid,
       count(*) over (partition by s.storeid, p.purchasedate) as  as [Store Daily Total Purchases],
       count(*) over (partition by c.customerid, p.purchasedate) as [Customer Daily Total Purchases]
from purchases p inner join   
     customer c
     on p.customerid = c.customerid join
     store s on p.storeid = s.storeid
于 2012-06-23T00:39:58.870 に答える