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