【问题标题】:can you join on a stored procedure?你可以加入存储过程吗?
【发布时间】:2012-10-09 12:02:03
【问题描述】:

我有一堆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...

加入存储过程是否有问题?我的方法可以吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql


    【解决方案1】:

    看看APPLY。使用APPLY 和table-valued functions 似乎是使用APPLY 的经典示例,我认为这就是您想要的。

    看看这个blog post的例子(使用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'
    

    【讨论】:

    【解决方案2】:

    不...不过,您可以使用表函数来代替。

    【讨论】:

    【解决方案3】:

    您可以不加入存储过程,但可以加入函数和视图。请注意,视图不能接受参数,并且函数的性能可能不如 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
    

    可能对您想要实现的目标有所帮助。

    【讨论】:

    • 非常感谢你能告诉我 select , count().... 是如何等同于有 count... 的吗?
    • 添加了一些显示相似性的代码。正如其他人所指出的,TVF 就是您所描述的,但是鉴于您的代码,我会花一些时间看看是否没有不同的方法。在不知道您的架构和数据的情况下,我当然不能肯定地说,但我认为您的方法不太可能是您尝试解决的任何问题的最佳解决方案。
    • 对不起,我会加入什么,我会数什么?
    • 对于每一行,计数是具有该患者和客户 ID 的行数,差异 s 不是 group by,而是您有 partition by,您可以包括任何或所有表中的其他列,无需返回并执行自联接。
    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2020-04-03
    • 2018-04-07
    • 2012-07-17
    相关资源
    最近更新 更多