SQL Query выполняет больше записей в WHERE CLAUSE - PullRequest
0 голосов
/ 23 января 2019

У меня есть SQL-запрос, в котором выполняются данные из VIEW. В этом запросе у меня есть 4 параметра, все данные параметров хранятся в другой таблице. 3 параметра имеют данные в таблице, а 1 параметр не имеет записи. В 3-х параметрах есть всего «1080» записей, но этот запрос выполняет «16000» записей.

Мой SQL-запрос:

SELECT DISTINCT COL1, COL2, COL3, COL4

FROM TABLE

WHERE (COL1 IN (SELECT VAL FROM RPPARAMLIST where flg = 'I') OR COL1 = COL1)
AND (COL2 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'P') OR COL2 = COL2)
AND (COL3 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'C') OR COL3 = COL3)
AND (COL4 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'U') OR COL4 = COL4);

Когда я удаляю условие OR в WHAE CLAUSE, тогда показывают пустые записи.

Пример данных:

1080 записей

enter image description here

Выходные данные:

13619 записей

enter image description here

Ответы [ 3 ]

0 голосов
/ 23 января 2019

размещение "OR COL1 = COL1" в вашем запросе всегда будет иметь значение true. Я считаю, что вы хотели сделать это так:

SELECT DISTINCT COL1, COL2, COL3, COL4
FROM TABLE
WHERE COL1 IN (SELECT VAL FROM RPPARAMLIST where flg = 'I')
AND COL2 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'P') 
AND COL3 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'C') 
AND COL4 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'U');
0 голосов
/ 23 января 2019

Я думаю, что это запрос, который вы хотите:

SELECT DISTINCT t.col1, t.col2, t.col3, t.col4
FROM table_name t
WHERE EXISTS
        (
            SELECT 1 
            FROM rpparamlist 
            WHERE flg = 'I' AND t.col1 = val 
        )
    OR EXISTS
        (
            SELECT 1 
            FROM rpparamlist 
            WHERE flg = 'P' AND t.col2 = TO_NUMBER(val) 
        )
    OR EXISTS
        (
            SELECT 1 
            FROM rpparamlist 
            WHERE flg = 'C' AND t.col3 = TO_NUMBER(val) 
        )
    OR EXISTS
        (
            SELECT 1 
            FROM rpparamlist 
            WHERE flg = 'U' AND t.col4 = TO_NUMBER(val) 
        );

Этот запрос проверит все 4 условия с помощью rpparamlist, затем объединит эти 4 результата, чтобы получить последний результат

0 голосов
/ 23 января 2019

Это «тавтологии»: все «и» закорочены. Вы можете удалить все предложения where и and, и вы получите тот же результат:

SELECT DISTINCT COL1, COL2, COL3, COL4
FROM TABLE

даст вам тот же результат, что и ваш текущий статус:

SELECT DISTINCT COL1, COL2, COL3, COL4
FROM TABLE
WHERE (<condition> OR TRUE) -- =TRUE
AND (<condition> OR TRUE)   -- =TRUE
AND (<condition> OR TRUE)   -- =TRUE
AND (<condition> OR TRUE)   -- =TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...