0

私はたくさんのWITH声明を持っています:

;with OneAccession as (
        select client_id,COUNT(patient_id) PatientCount from
        (
            select client_id,patient_id
            from F_ACCESSION_DAILY
            group by CLIENT_ID,PATIENT_ID
            having COUNT(ACCESSION_ID)=1
        ) a
        group by CLIENT_ID
    )
    ,

    TwoAccessions as (
    select client_id,COUNT(patient_id) PatientCount from
        (
            select client_id,patient_id
            from F_ACCESSION_DAILY
            group by CLIENT_ID,PATIENT_ID
            having COUNT(ACCESSION_ID)=2
        ) a
    group by client_id
    )

    ,

    ThreeAccessions as (
    select client_id,COUNT(patient_id) PatientCount from
    (
        select client_id,patient_id
        from F_ACCESSION_DAILY
        group by CLIENT_ID,PATIENT_ID
        having COUNT(ACCESSION_ID)=3
    ) a
    group by client_id
    )
etc

そして私はこれらの声明に参加します

select * from myTable
join OneAccession
on...
join TwoACcessions
on...
join ThreeAccessions

これらすべてのwithステートメントを用意する代わりに、ストアドプロシージャを作成できますか?の値を渡して、having count(accession_id)=**@myParam**これを実行します。

select * from myTable
join storedproc(1)
on...
join storedproc(2)
on...
etc...

ストアドプロシージャへの参加に問題はありますか?私の方法論は大丈夫ですか?

4

3 に答える 3

3

をご覧くださいAPPLYテーブル値関数APPLYでの使用は、を使用するための典型的な例のようであり、それがあなたの望むものだと思います。APPLY

例を示したこのブログ投稿をご覧ください(AdventureWorksを使用)。

select f.FirstName
      ,f.LastName
      ,f.JobTitle
      ,f.ContactType
      ,cc.CardNumber
from Sales.CreditCard cc
join Sales.ContactCreditCard ccc on cc.CreditCardID=ccc.CreditCardID
cross apply dbo.ufnGetContactInformation(ccc.ContactID) f
where cc.ExpYear=2008
  and cc.ExpMonth=6
  and cc.CardType='Vista'
于 2012-10-18T22:26:08.553 に答える
1

いいえ...代わりにテーブル関数を使用してこれを行うことができます。

于 2012-10-18T22:26:22.603 に答える
1

ストアドプロシージャに参加することはできませんが、関数とビューの両方に参加することはできます。ビューはパラメーターを受け取ることができず、関数はCTEほどパフォーマンスが高くない可能性があることに注意してください。

また、クエリを見ると、新しいウィンドウ関数を調べる必要があるように見えます。

;with cte as (
    select *, count(*) over (partition by client_id, patient_id) patientcount
    from f_accession_daily
)
select * from myTable
     inner join cte on ... and patientCount=1

あなたが達成しようとしていることを助けるかもしれません。

于 2012-10-18T22:32:31.953 に答える