SQL Server:每个GROUP BY表达式必须包含至少一个不是外部引用的列

时间:2019-01-23 07:33:13

标签: sql sql-server group-by

场景1:

我有两个表INFUSION_APP_APPOINTMENT,INFUSION_APP_NURSE_NOTES,其中 INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID = INFUSION_APP_APPOINTMENT.ID,我想找出INFUSION_APP_NURSE_NOTES.ID与INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID相同的地方。

例如如果INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID = 1并且INFUSION_APP_NURSE_NOTES.ID为12,15,78,那么我想显示所有 INFUSION_APP_NURSE_NOTES.ID的位置,其中INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID = 1。 我使用以下脚本

SELECT INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID,INFUSION_APP_NURSE_NOTES.ID
FROM INFUSION_APP_NURSE_NOTES
GROUP BY INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID,INFUSION_APP_NURSE_NOTES.ID
HAVING COUNT(INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID)>1

但是它没有给我任何记录。

场景2:

我正在脚本下面运行,目的是获得具有不同INFUSION_APP_NURSE_NOTES.ID但具有相同INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID的重复记录。

SELECT INFUSION_APP_NURSE_NOTES.ID,INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID,INFUSION_APP_NURSE_NOTES.TYPE
FROM INFUSION_APP_NURSE_NOTES
WHERE 
EXISTS (
    SELECT 1 FROM  INFUSION_APP_APPOINTMENT
    WHERE
    INFUSION_APP_NURSE_NOTES.ENABLE=1 
    AND INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID=INFUSION_APP_APPOINTMENT.ID

    GROUP BY INFUSION_APP_NURSE_NOTES.ID
    HAVING COUNT(INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID)>1
)

ORDER BY INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID;

但出现错误

  

SQL错误(164):每个GROUP BY表达式必须至少包含一个   不是外部参考的列

如何解决?

我只希望有一个具有共同APPOINTMENT_ID但n互不相同的行

2 个答案:

答案 0 :(得分:0)

尝试一下

SELECT INFUSION_APP_NURSE_NOTES.ID,INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID,INFUSION_APP_NURSE_NOTES.TYPE
FROM INFUSION_APP_NURSE_NOTES
WHERE 
EXISTS (
    SELECT COUNT(B.APPOINTMENT_ID), B.ID
    FROM  INFUSION_APP_APPOINTMENT A
        INNER JOIN INFUSION_APP_NURSE_NOTES B ON B.APPOINTMENT_ID = A.ID
    WHERE
        B.ENABLE=1 
    GROUP BY B.ID
    HAVING COUNT(B.APPOINTMENT_ID)>1
)
ORDER BY INFUSION_APP_NURSE_NOTES.APPOINTMENT_ID;

答案 1 :(得分:0)

问题尚不清楚。查找重复项通常使用ROW_NUMBER()之类的排名函数执行。此查询:

SELECT *,ROW_NUMBER(PARTITION BY APPOINTMENT_ID ORDER BYID) as RN
FROM  INFUSION_APP_NURSE_NOTES
WHERE
    ENABLE=1 

将按照ID对同一约会的笔记进行排名,并从最早的笔记开始返回1,2,3等。 ORDER BY ID DESC将为 latest 注释返回1。

可以在子查询或CTE中使用它来查找第一个,最后一个或重复的记录,例如:

with notes as (
    SELECT *,ROW_NUMBER(PARTITION BY APPOINTMENT_ID ORDER BYID) as RN
    FROM  INFUSION_APP_NURSE_NOTES
    WHERE
        ENABLE=1 
)
select * 
from notes
where RN=1

在每次约会时将返回第一笔便笺:

where RN>1

将仅返回重复项。

问题并没有说明应该如何处理重复项。

如果问题是如何从具有多个注释的约会中返回 all 个注释,则可以使用子查询来返回包含多个注释的APPOINTMENT_ID s。无需包含INFUSION_APP_APPOINTMENT表:

SELECT *
FROM INFUSION_APP_NURSE_NOTES
where 
    ENABLE=1 AND 
    APPOINTMENT_ID IN ( SELECT APPOINTMENT_ID 
                          FROM  INFUSION_APP_NURSE_NOTES
                          WHERE
                              ENABLE=1 
                          group by APPOINTMENT_ID 
                          having count(*)>1)