SQL Server: каждое выражение GROUP BY должно содержать хотя бы один столбец, который не является внешней ссылкой - PullRequest
0 голосов
/ 23 января 2019

сценарий 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 голосов
/ 23 января 2019

Вопрос неясен.Поиск дубликатов обычно выполняется с использованием функций ранжирования, таких как 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 вернет 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

Вернет только дубликаты.

Вопрос не говорит, что делать с дубликатами.

Если вопрос в том, как вернуть все примечания от встреч с несколькими примечаниями, подзапрос может использоваться для возврата APPOINTMENT_ID с более чем одной запиской.Нет необходимости включать таблицу 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)
0 голосов
/ 23 января 2019

Попробуйте это

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;
...