试图学习T-SQL子查询语法

时间:2012-12-26 21:41:16

标签: tsql

我是新来的,所以希望能正确发布。

我有一个表PTC_CERT_PERIOD,并希望获得表中每个PATIENT_ID的最大PERIOD_NO。我可以通过查看下面的另一个视图来做到这一点:

SELECT TOP (100) PERCENT
    dbo.PTC_CERT_PERIOD.CERT_PERIOD_ID
,   dbo.PTC_CERT_PERIOD.PATIENT_ID
,   dbo.PTC_CERT_PERIOD.CERTIFICATION_DATE
,   dbo.PTC_CERT_PERIOD.CERT_END_DATE
,   dbo.PTC_CERT_PERIOD.PAY_SOURCE_POINTER
,   dbo.PTC_CERT_PERIOD.IS_ACTIVE
,   dbo.VW_SDH_CAS_MaxCertPeriod1.MaxCertPeriod
,   dbo.PTC_CERT_PERIOD.CREATE_DATE
FROM
    dbo.PTC_CERT_PERIOD
    INNER JOIN dbo.VW_SDH_CAS_MaxCertPeriod1
    ON dbo.PTC_CERT_PERIOD.PATIENT_ID = dbo.VW_SDH_CAS_MaxCertPeriod1.PATIENT_ID
       AND dbo.PTC_CERT_PERIOD.PERIOD_NO = dbo.VW_SDH_CAS_MaxCertPeriod1.MaxCertPeriod

但在我看来,我应该能够编写一个子查询来做同样的事情,我无法为子查询获得正确的语法。我已经尝试了几个小时,我最近失败的迭代是:

SELECT
    CERT_PERIOD_ID
,   PATIENT_ID
,   CERTIFICATION_DATE
,   CERT_END_DATE
,   PAY_SOURCE_POINTER
,   IS_ACTIVE
,   CREATE_DATE
,   PERIOD_NO
FROM
    dbo.PTC_CERT_PERIOD
WHERE
    (PERIOD_NO IN 
        (
            SELECT
                PATIENT_ID AS MaxPtID
            ,   MAX(PERIOD_NO) AS MaxCertPeriod
            FROM
                dbo.PTC_CERT_PERIOD AS PTC_CERT_PERIOD_1
        )
    )

似乎我尝试的任何内容都会收到一条错误消息,例如“列dbo.PTC-CERT_PERIOD.PATIENT_ID在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。只有一个表达式可以当子查询没有用EXISTS引入时,在选择列表中指定。我玩了几个EXISTS状态,如果它们运行结果是关闭的,列出患者的所有PERIOD_NO,而不仅仅是Max。可以任何人点我走在正确的轨道上?

1 个答案:

答案 0 :(得分:1)

当子查询用作表时,它们需要别名......只需添加任何内容......我通常使用Z

SELECT  CERT_PERIOD_ID,  PATIENT_ID,  CERTIFICATION_DATE,   
   CERT_END_DATE, PAY_SOURCE_POINTER, IS_ACTIVE, 
   CREATE_DATE, PERIOD_NO
FROM dbo.PTC_CERT_PERIOD
WHERE PERIOD_NO IN 
    (SELECT PATIENT_ID MaxPtID,  
           MAX(PERIOD_NO) MaxCertPeriod
     FROM dbo.PTC_CERT_PERIOD) Z