#sql #postgresql
#sql #postgresql
Вопрос:
Я хотел бы выбрать все строки таблицы, где значение столбца находится в результатах запроса. концептуально приведенный ниже код выглядит так, как будто он должен работать, но я не уверен, является ли это синтаксической ошибкой
SELECT * FROM generated.existing_conditions ec
WHERE st_to IN (
SELECT st_to FROM
(SELECT st_to AS st_to, COUNT(*) AS total_count
FROM generated.existing_conditions ec GROUP BY st_to) AS source_1
WHERE total_count > 1
) source_2
;
Это просто не разрешено? могу ли я переписать его как a WITH query AS
?
Моя цель — выбрать уникальные идентификаторы любой строки со значением атрибута, которое повторяется, поскольку это может быть ошибкой в данных.
Комментарии:
1. ответ гондона ниже — это информация, которую я искал. Я понял, что ошибка, которую я видел, заключалась в том, что мне не нужен псевдоним для внешнего подзапроса, поскольку он использовался,
IN
а не какFROM
таблица.
Ответ №1:
Ваш запрос в порядке, хотя два уровня подзапроса не нужны. Вы могли бы переписать его как:
SELECT *
FROM generated.existing_conditions ec
WHERE st_to IN (SELECT ec2.st_to FROM
FROM generated.existing_conditions ec2
GROUP BY ec2.st_to
HAVING COUNT(*) > 1
) ;
Однако я бы предложил вместо этого оконные функции:
select ec.*
from (select ec.*, count(*) over (partition by st_to) as cnt
from generated.existing_conditions ec
) ec
where cnt > 1;
Оба подзапроса могут быть написаны с использованием CTE, если вы предпочитаете CTE.
Ответ №2:
по сравнению с тем, что я опубликовал, ошибка исправлена ниже путем удаления source_2
псевдонима.
SELECT * FROM generated.existing_conditions ec
WHERE st_to IN (
SELECT st_to FROM
(SELECT st_to AS st_to, COUNT(*) AS total_count FROM generated.existing_conditions ec GROUP BY st_to) AS source_1
WHERE total_count > 1
);