как выбрать, где имя_столбца в (подзапрос)

#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
);