УДАЛЕНИЕ строк без связей

#sql #postgresql

Вопрос:

Может ли кто-нибудь помочь мне с этим? У меня есть 3 таблицы, как показано ниже:

 DROP TABLE IF EXISTS cp,qr,lu; CREATE TABLE public.cp (  id bigserial PRIMARY KEY,  job_id bigint NOT NULL,  domain_id bigint NOT NULL ); CREATE TABLE public.qr (  id bigserial PRIMARY KEY,  checkpoint_id bigint NOT NULL,  objectguid uuid,  CONSTRAINT fk FOREIGN KEY (checkpoint_id)  REFERENCES public.cp (id) ); CREATE TABLE public.lu(  id bigserial PRIMARY KEY,  objectguid uuid NOT NULL,  domain_id bigint NOT NULL ); INSERT INTO cp(job_id, domain_id) VALUES(1,1); INSERT INTO cp(job_id, domain_id) VALUES(1,1); INSERT INTO cp(job_id, domain_id) VALUES(1,11); INSERT INTO cp(job_id, domain_id) VALUES(2,2); INSERT INTO cp(job_id, domain_id) VALUES(2,22); INSERT INTO cp(job_id, domain_id) VALUES(9,1); SELECT * from cp; INSERT INTO qr(checkpoint_id, objectguid) VALUES(1, '637779d2-6d43-4639-b427-5323aa2a0111'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(1, '637779d2-6d43-4639-b427-5323aa2a0111'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(2, '637779d2-6d43-4639-b427-5323aa2a0211'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(2, '637779d2-6d43-4639-b427-5323aa2a0211'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(3, '637779d2-6d43-4639-b427-5323aa2a3111'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(3, '637779d2-6d43-4639-b427-5323aa2a3111'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(4, '637779d2-6d43-4639-b427-5323aa2a0422'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(4, '637779d2-6d43-4639-b427-5323aa2a0422'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(5, '637779d2-6d43-4639-b427-5323aa2a5222'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(5, '637779d2-6d43-4639-b427-5323aa2a5222'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(6, '637779d2-6d43-4639-b427-5323aa2a0691'); INSERT INTO qr(checkpoint_id, objectguid) VALUES(6, '637779d2-6d43-4639-b427-5323aa2a0691'); SELECT * from qr; INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a0111',1); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a0111',1); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a0211',1); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a0211',1); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a3111',11); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a3111',11); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a0422',2); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a0422',2); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a5222',22); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a5222',22); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a0691',1); INSERT INTO lu(objectguid, domain_id) VALUES('637779d2-6d43-4639-b427-5323aa2a0691',1); SELECT * from lu; SELECT * from cp;  

Теперь я пытаюсь удалить все lu записи, которые подпадают под определенную cp.job_id У меня есть cp.id , я хочу сначала найти все cp записи с совпадением job_id , а затем удалить соответствующие lu записи. Например, учитывая cp.id=1 , что я хочу удалить только 4 записи из lu Я пытаюсь написать такой код, но безуспешно

 DELETE FROM lu USING cp WHERE EXISTS(SELECT FROM qr  WHERE qr.objectguid = lu.objectguid  AND cp.domain_id=lu.domain_id  AND cp.id=1 );  

Комментарии:

1. Для cp.id=1 в «cp» есть две записи с одинаковыми job_id и domain_id. Эти двое cp.id у каждого может быть одна или несколько записей «qr». Я пытаюсь найти все эти qr-записи в lu и удалить их из lu. ВЫБЕРИТЕ ИДЕНТИФИКАТОР ИЗ cp, ГДЕ идентификатор задания В (ВЫБЕРИТЕ идентификатор задания ИЗ cp, ГДЕ идентификатор = 1) И идентификатор домена В (ВЫБЕРИТЕ идентификатор домена ИЗ cp, ГДЕ идентификатор = 1); ВЫБЕРИТЕ идентификатор объекта ИЗ qr, ГДЕ идентификатор контрольной точки В (1,2); УДАЛИТЕ ИЗ lu, ГДЕ идентификатор домена В (ВЫБЕРИТЕ идентификатор домена ИЗ cp, ГДЕ идентификатор = 1) И идентификатор объекта В (список выше);

Ответ №1:

Ваша проблема, вероятно USING , заключается в отсутствии условия соединения.

Вы сами нашли решение в комментарии:

 DELETE FROM lu USING cp WHERE cp.domain_id = lu.domain_id  AND cp.domain_id=1  AND cp.job_id=1  AND EXISTS (SELECT FROM qr  WHERE qr.objectguid = lu.objectguid  AND qr.checkpoint_id = cp.id);  

Комментарии:

1. Привет, Альбе, спасибо за ответ. Это все равно приведет к удалению 6 записей. В «cp» есть две записи с одинаковыми job_id и domain_id. Эти двое cp.id у каждого может быть одна или несколько записей «qr». Я пытаюсь найти все эти qr-записи в lu и удалить их. ВЫБЕРИТЕ ИДЕНТИФИКАТОР ИЗ cp, ГДЕ идентификатор задания В (ВЫБЕРИТЕ идентификатор задания ИЗ cp, ГДЕ идентификатор = 1) И идентификатор домена В (ВЫБЕРИТЕ идентификатор домена ИЗ cp, ГДЕ идентификатор = 1); ВЫБЕРИТЕ идентификатор объекта ИЗ qr, ГДЕ идентификатор контрольной точки В (1,2); УДАЛИТЕ ИЗ lu, ГДЕ идентификатор домена В (ВЫБЕРИТЕ идентификатор домена ИЗ cp, ГДЕ идентификатор = 1) И идентификатор объекта В (список выше);

2. Я не понимаю. Пожалуйста, опишите, какие из этих 6 строк не следует удалять и почему.

3. УДАЛИТЕ ИЗ lu, ГДЕ идентификатор домена В (ВЫБЕРИТЕ идентификатор домена ИЗ cp, ГДЕ id = 1) И идентификатор объекта В (‘637779d2-6d43-4639-b427-5323aa2a0111’, ‘637779d2-6d43-4639-b427-5323aa2a0111’, ‘637779d2-6d43-4639-b427-5323aa2a0211’, ‘637779d2-6d43-4639-b427-5323aa2a0211’, ‘637779d2-6d43-4639-в427-5323аа2а0211’)

4. «qr» — это текущая таблица, в которой содержатся дополнительные изменения для каждого домена и для каждого задания. Когда эти изменения вступают, создается новый cp (контрольная точка), и изменения сбрасываются в «qr». Во время фиксации записи «qr» измельчаются в «lu», который содержит самое текущее состояние для каждого объекта, представленного objectguid. Все это отлично работает. Проблема заключается в том, что мы хотим сбросить все объекты в «lu» для каждого домена на задание (в основном с учетом cp.id) Спасибо, что нашли время взглянуть на это.

5. УДАЛИТЬ ИЗ lu С ПОМОЩЬЮ cp, ГДЕ cp.domain_id = lu.domain_id И cp.domain_id=1 И cp.job_id=1 И СУЩЕСТВУЕТ (ВЫБЕРИТЕ ИЗ qr, ГДЕ qr.objectguid = lu.objectguid И qr.checkpoint_id = cp.id);