loading..
Русский    English
07:58
листать

Общие табличные выражения (CTE) стр. 3

Запрос, который мы использовали для удаления дубликатов в SQL Server

  1. WITH CTE AS (
  2.     SELECT name, ROW_NUMBER() OVER(PARTITION BY name ORDER BY name) rnk
  3.     FROM T
  4.      )
  5. DELETE FROM CTE
  6. WHERE rnk > 1;
в PostgreSQL завершится ошибкой:

ОШИБКА:  отношение "cte" не существует

Эта ошибка означает, что мы можем удалять строки из базовых таблиц, но не из CTE. Тем не менее, возможно выполнить удаление дубликатов одним запросом, используя CTE.

Поступим следующим образом:

  1. Удалим все строки из базовой таблицы, возвращая их в табличное выражение (первое CTE).
  2. Используя результат 1 шага, формируем уникальные строки, которые должны остаться в таблице (второе CTE).
  3. Вставляем строки, полученные на шаге 2 в базовую таблицу.

Воспользуемся таблицей из цитируемого примера, чтобы написать запрос:

  1. CREATE TABLE T (name varchar(10));
  2. INSERT INTO T VALUES
  3. ('John'),
  4. ('Smith'),
  5. ('John'),
  6. ('Smith'),
  7. ('Smith'),
  8. ('Tom');

Вот и сам запрос

  1. WITH t_deleted AS
  2. (DELETE FROM T returning *), -- 1 шаг
  3. t_inserted AS
  4. (SELECT name, ROW_NUMBER() OVER(PARTITION BY name ORDER BY name) rnk
  5.     FROM t_deleted) -- 2 шаг
  6. INSERT INTO T SELECT name FROM t_inserted
  7. WHERE rnk=1; -- 3 шаг (сюда мы перенесли условие отбора из 2 шага для сокращения кода)

Если теперь выполнить запрос

  1. SELECT * FROM T;

то получим требуемый результат

name
John
Smith
Tom

Страницы: 1 2 3
Развернуть всё
Свернуть всё

Содержание:

Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
продать stellar
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.