Alternative to INNER JOIN
419360Jun 15 2004 — edited Jun 17 2004I've a table like this:
CREATE TABLE ADRESY
(
IDPOWIATU NUMBER(10) NOT NULL,
IDOBIEKTU NUMBER(10) NOT NULL,
IDADRESU NUMBER(10) NOT NULL,
TYPADRESU NUMBER(10) NOT NULL,
NAZWAWLASNA VARCHAR2(255 BYTE),
IDKRAJU NUMBER(10),
IDWOJEWS NUMBER(10),
IDPOWIATUS NUMBER(10),
IDGMINYS NUMBER(10),
IDMIEJSC NUMBER(10),
IDULICY NUMBER(10),
NRDOMU VARCHAR2(50 BYTE),
NRLOKALU VARCHAR2(50 BYTE),
KODPOCZTOWY VARCHAR2(50 BYTE),
POCZTA VARCHAR2(50 BYTE),
STATUS NUMBER(3) NOT NULL,
DATAUTW DATE NOT NULL,
DATAWER DATE NOT NULL,
DATAARCH DATE
)
and need to query all the duplicate rows that have a common subset of columns:
SELECT
ADRA.IdObiektu,
ADRA.Status,
ADRB.IdObiektu AS ZnalezioneId
FROM
ADRESY ADRA
INNER JOIN
ADRESY ADRB
ON
(ADRA.IDPOWIATU = ADRB.IDPOWIATU) AND
(ADRA.TYPADRESU = ADRB.TYPADRESU) AND
(ADRA.NAZWAWLASNA = ADRB.NAZWAWLASNA OR (ADRA.NAZWAWLASNA IS NULL AND ADRB.NAZWAWLASNA IS NULL)) AND
(ADRA.IDKRAJU = ADRB.IDKRAJU OR (ADRA.IDKRAJU IS NULL AND ADRB.IDKRAJU IS NULL)) AND
(ADRA.IDWOJEWS = ADRB.IDWOJEWS OR (ADRA.IDWOJEWS IS NULL AND ADRB.IDWOJEWS IS NULL)) AND
(ADRA.IDPOWIATUS = ADRB.IDPOWIATUS OR (ADRA.IDPOWIATUS IS NULL AND ADRB.IDPOWIATUS IS NULL)) AND
(ADRA.IDGMINYS = ADRB.IDGMINYS OR (ADRA.IDGMINYS IS NULL AND ADRB.IDGMINYS IS NULL)) AND
(ADRA.IDMIEJSC = ADRB.IDMIEJSC OR (ADRA.IDMIEJSC IS NULL AND ADRB.IDMIEJSC IS NULL)) AND
(ADRA.IDULICY = ADRB.IDULICY OR (ADRA.IDULICY IS NULL AND ADRB.IDULICY IS NULL)) AND
(ADRA.NRDOMU = ADRB.NRDOMU OR (ADRA.NRDOMU IS NULL AND ADRB.NRDOMU IS NULL)) AND
(ADRA.NRLOKALU = ADRB.NRLOKALU OR (ADRA.NRLOKALU IS NULL AND ADRB.NRLOKALU IS NULL)) AND
(ADRA.KODPOCZTOWY = ADRB.KODPOCZTOWY OR (ADRA.KODPOCZTOWY IS NULL AND ADRB.KODPOCZTOWY IS NULL)) AND
(ADRA.POCZTA = ADRB.POCZTA OR (ADRA.POCZTA IS NULL AND ADRB.POCZTA IS NULL)) AND
ADRA.IdAdresu <> ADRB.IdAdresu
WHERE
ADRA.IdObiektu IN (SELECT IdObiektu FROM ObiektyTrans) AND
ADRB.STATUS = 0 AND
ADRA.STATUS IN (2,5);
For 64000 matching rows (SELECT IdObiektu FROM ObiektyTrans) and 64428 rows in ADRESY it takes about few minutes to
complete. I try to use GROUP BY or analytical functions
to write faster query but so far didn't succeeded.
Any ideas ?
Thank You