我是新来的,所以希望能正确发布。
我有一个表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。可以任何人点我走在正确的轨道上?
答案 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