100 lines
2.7 KiB
SQL
100 lines
2.7 KiB
SQL
-- Query 3: prj(sel-const+sel-join)
|
|
|
|
CREATE TABLE r3 WITHOUT OIDS AS
|
|
SELECT TID, POWSTATE,POB,MARITAL,FERTIL FROM rt
|
|
WHERE (FERTIL > 4 OR FERTIL = -1) AND
|
|
(MARITAL = 1 OR MARITAL = -1) AND
|
|
(POWSTATE = POB OR POWSTATE = -1 OR POB = -1);
|
|
|
|
CREATE TABLE f3 WITHOUT OIDS AS
|
|
SELECT ft.* FROM ft, r3
|
|
WHERE ft.tid = r3.tid AND ft.Col IN ('MARITAL','FERTIL','POB','POWSTATE');
|
|
|
|
CREATE TABLE consts3 WITHOUT OIDS AS
|
|
SELECT HID, POWSTATE, POB
|
|
FROM r3, f3
|
|
WHERE r3.TID = f3.TID AND
|
|
(POWSTATE = -1 AND POB <> -1 OR POWSTATE <> -1 AND POB = -1) AND
|
|
(CASE WHEN POWSTATE = -1 THEN f3.COL = 'POWSTATE' ELSE f3.COL = 'POB' END);
|
|
|
|
----------
|
|
create unique index consts3idx on consts3(hid);
|
|
|
|
SET ENABLE_SEQSCAN=OFF;
|
|
----------
|
|
|
|
CREATE TABLE c3 WITHOUT OIDS AS
|
|
select ct.* from ct, f3
|
|
where ct.hid=f3.hid and
|
|
(CASE WHEN f3.Col = 'FERTIL'
|
|
THEN ct.VALUE > 4
|
|
ELSE (CASE WHEN f3.Col = 'MARITAL'
|
|
THEN ct.VALUE = 1
|
|
ELSE f3.Col IN ('POWSTATE','POB') AND
|
|
(NOT EXISTS (SELECT 1 FROM consts3 where consts3.hid = f3.hid) OR
|
|
(CASE WHEN f3.Col = 'POWSTATE' THEN
|
|
EXISTS (SELECT 1 from consts3 WHERE consts3.hid = f3.hid AND consts3.POB = ct.VALUE)
|
|
ELSE (CASE WHEN f3.Col = 'POB' THEN EXISTS (SELECT 1 from consts3 WHERE consts3.hid = f3.hid AND consts3.POWSTATE = ct.VALUE) END)
|
|
END))
|
|
END)
|
|
END);
|
|
|
|
----------
|
|
SET ENABLE_SEQSCAN=ON;
|
|
----------
|
|
|
|
DELETE FROM f3
|
|
WHERE HID NOT IN (SELECT HID FROM c3);
|
|
|
|
|
|
------------------------------------
|
|
|
|
-- apply the join condition POWSTATE=POB
|
|
|
|
SELECT 1 from filter3();
|
|
|
|
-------------------------------------
|
|
|
|
--DELETE FROM c3
|
|
--where
|
|
--exists(select 1 from f3 _a, f3 _b
|
|
-- where _a.cid = _b.cid and _a.tid = _b.tid and
|
|
-- _a.hid <> _b.hid and _a.hid = c3.hid and
|
|
-- c3.wid not in (select wid from c3 _c
|
|
-- where _b.hid = _c.hid));
|
|
|
|
CREATE TABLE twins3 WITHOUT OIDS AS
|
|
SELECT _a.hid as left, _b.hid as right
|
|
FROM f3 _a, f3 _b
|
|
WHERE _a.cid = _b.cid and _a.tid = _b.tid and _a.hid <> _b.hid;
|
|
|
|
DELETE FROM c3
|
|
where
|
|
exists(select 1 from twins3
|
|
where twins3.left = c3.hid and
|
|
c3.wid not in (select wid from c3 _c
|
|
where twins3.right = _c.hid));
|
|
|
|
|
|
--CREATE TABLE DEL3 WITHOUT OIDS AS
|
|
--SELECT TID FROM f3
|
|
--WHERE HID NOT IN (SELECT HID FROM c3);
|
|
|
|
CREATE TABLE DEL3 WITHOUT OIDS AS
|
|
SELECT f3.TID FROM f3 left join c3 on (f3.hid = c3.hid)
|
|
WHERE c3.hid is null;
|
|
|
|
|
|
DELETE FROM r3
|
|
WHERE TID IN (SELECT TID FROM DEL3);
|
|
|
|
DELETE FROM f3
|
|
WHERE TID IN (SELECT TID FROM DEL3) OR Col = 'POB';
|
|
|
|
--DELETE FROM f3
|
|
--WHERE TID IN (SELECT TID FROM DEL3) OR Col NOT IN ('POWSTATE','MARITAL','FERTIL');
|
|
|
|
DELETE FROM c3
|
|
WHERE HID NOT IN (SELECT HID FROM f3);
|
|
|