Нельзя использовать ALIAS в операторе удаления в базе данных MARIA - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь удалить дубликаты из таблицы, но не позволяет использовать псевдоним. Пробовал различные решения, приведенные на нескольких форумах.

запрос:

DELETE FROM `table` AS t1
        WHERE EXISTS (
         SELECT 1 FROM `table` AS t2
         WHERE t2.`col1` = t1.`col1`
         AND t2.`col2` = t1.`col2`
         AND t2.id > t1.id )

Ответы [ 4 ]

1 голос
/ 06 ноября 2019

Вы можете попробовать это, это более сложно, но гораздо безопаснее, потому что использование внутреннего удаления может быть очень опасным, поэтому вы можете сначала проверить, что вы хотите удалить:

SET @discriminator = 0;
SET @p1 = null;
SET @p2 = null;

CREATE TEMPORARY TABLE temp_rows(
    `id` INT PRIMARY KEY,
    `index` INT,
    `col1` COL1TYPE,
    `col2` COL2TYPE
);

INSERT INTO temp_rows (`index`, `col1`, `col2`, `id`)
SELECT CASE WHEN @p1 != col1 OR @p2 != col2 THEN @discriminator := 0 ELSE @discriminator := @discriminator + 1 END AS 'index', 
    @p1 := col1 AS 'col1', 
    @p2 := col2 AS 'col2',
    id
FROM `schema`.table
ORDER BY col1, col2, id desc;

DELETE FROM table WHERE EXISTS (
     SELECT 1 FROM `temp_rows`
     WHERE table.`id` = temp_rows.`id`
);

DROP TEMPORARY TABLE temp_rows;
1 голос
/ 06 ноября 2019

Вы можете использовать мульти-таблицу DELETE оператор:

DELETE t1 
FROM `table` t1
JOIN `table` t2 ON t2.col1 = t1.col1 AND t2.col2 = t1.col2 AND t2.id > t1.id
1 голос
/ 06 ноября 2019

Вы можете попробовать использовать внутреннее объединение вместо существующего подзапроса

DELETE t
FROM `billing_squarecustomer` t
INNER JOIN  (
   SELECT  t2.`patient_id`.
   FROM `billing_squarecustomer` AS t2
   INNER JOIN `billing_squarecustomer` AS t1
   WHERE t2.`patient_id` = t1.`patient_id`
   AND t2.`merchant_id` = t1.`merchant_id`
   AND t2.id > t1.id
) tdel = tdel.patient_id = t.patient_id
0 голосов
/ 06 ноября 2019

Вы можете использовать left join, чтобы удалить дубликаты в той же таблице, когда id равно primary key

delete t1
from `table` as t1
left join `table` as t2 on t1.col1 = t2.col1 and t1.col2 = t2.col2 and t1.id < t2.id
where t2.id is not null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...