Нужна помощь, чтобы найти проблему в запросе и оптимизировать ее - PullRequest
0 голосов
/ 11 октября 2018

Использование запроса ниже в DB2 для извлечения записей.Если ни одна запись не найдена, то пытаюсь использовать значение по умолчанию в этом столбце.Но все работает не так, как ожидалось.Определенно есть проблема с запросом, а также необходимо его оптимизировать.Ожидается некоторая помощь / предложения / положительная критика.

Запрос:

SELECT DISTINCT(t1.col1),t1.col2,t1.col3,t1.col4,t1.col5
CASE 
WHEN t1.col1 = '' THEN ‘AA99’ ELSE t1.col1 END AS col1
WHEN t1.col2 = '' THEN ‘AA99’ ELSE t1.col2 END AS col2
FROM TABLE1 t1
INNER JOIN TABLE2 t2
ON (t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.col3 = t2.col3 
INNER JOIN TABLE3 t3
ON (t1.col2 = t3.col2)
INNER JOIN TABLE4 t4
ON (t1.col1 = t4.col1 AND t1.col3 = t4.col3)
WHERE (((t1.col1 <> 'NA' OR t1.col1 IS NOT NULL) AND (t2.col1 <> 'NA' OR t2.col1 IS NOT NULL)) 
AND ((t1.col2 <> 'NA' OR t1.col2 IS NOT NULL) AND (t2.col2 <> 'NA' OR t2.col2 IS NOT NULL))
GROUP BY t1.col1,t1.col2 ;

Ошибка:

1) [Code: -104, SQL State: 42601]  An unexpected token "WHEN" was found following ".col1
CASE 
".  Expected tokens may include:  "INTO".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.22.29
2) [Code: -727, SQL State: 56098]  An error occurred during implicit system action type "2". Information returned for the error includes SQLCODE "-104", SQLSTATE "42601" and message tokens "WHEN|.col1
CASE 
|INTO".. SQLCODE=-727, SQLSTATE=56098, DRIVER=4.22.29
3) Group By is also not working

Update_1:

Как было предложено, попробуйте следующее:

SELECT DISTINCT (t1.col1),t1.col2,t1.col3,t1.col4,t1.col5,
CASE 
    WHEN t1.col1 = '' THEN ‘AA99’
    ELSE t1.col1
END AS newcol1,
CASE
    WHEN t1.col2 = '' THEN ‘AA99’
    ELSE t1.col2
END AS newcol2
FROM TABLE1 t1
INNER JOIN TABLE2 t2
ON (t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.col3 = t2.col3 
INNER JOIN TABLE3 t3
ON (t1.col2 = t3.col2)
INNER JOIN TABLE4 t4
ON (t1.col1 = t4.col1 AND t1.col3 = t4.col3)
WHERE (((t1.col1 <> 'NA' OR t1.col1 IS NOT NULL) AND (t2.col1 <> 'NA' OR t2.col1 IS NOT NULL)) 
AND ((t1.col2 <> 'NA' OR t1.col2 IS NOT NULL) AND (t2.col2 <> 'NA' OR t2.col2 IS NOT NULL))
GROUP BY newcol1,newcol2;   

Ошибка:

1) [Code: -206, SQL State: 42703]  "newcol1" is not valid in the context where it is used.. SQLCODE=-206, SQLSTATE=42703, DRIVER=4.22.29
2) [Code: -727, SQL State: 56098]  An error occurred during implicit system action type "2". Information returned for the error includes SQLCODE "-206", SQLSTATE "42703" and message tokens "newcol1".. SQLCODE=-727, SQLSTATE=56098, DRIVER=4.22.29  

Смущает, но не понимает, какую глупость я здесь делаю.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Если вы используете IBM Data Studio, она подскажет, где начинается ваша синтаксическая ошибка.Это значительно упрощает написание синтаксически правильного SQL, такого как

SELECT  DISTINCT
        t1.col1,t1.col2,t1.col3,t1.col4,t1.col5
,       CASE WHEN t1.col1 = '' THEN 'AA99' ELSE t1.col1 END AS col1
,       CASE WHEN t1.col2 = '' THEN 'AA99' ELSE t1.col2 END AS col2
FROM TABLE1 t1
INNER JOIN TABLE2 t2
ON (t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.col3 = t2.col3)
INNER JOIN TABLE3 t3
ON (t1.col2 = t3.col2)
INNER JOIN TABLE4 t4
ON (t1.col1 = t4.col1 AND t1.col3 = t4.col3)
WHERE ((t1.col1 <> 'NA' OR t1.col1 IS NOT NULL) AND (t2.col1 <> 'NA' OR t2.col1 IS NOT NULL)) 
AND   ((t1.col2 <> 'NA' OR t1.col2 IS NOT NULL) AND (t2.col2 <> 'NA' OR t2.col2 IS NOT NULL))
GROUP BY t1.col1,t1.col2 ;
0 голосов
/ 11 октября 2018

Вы пропускаете часть CASE вашего второго утверждения case-when.Кроме того, вы выбираете col1 и col2, а затем снова выбираете их с помощью оператора case-when с использованием псевдонима, который может объяснить группу по проблемам.Попробуйте эту версию:

SELECT DISTINCT 
t1.col1,
t1.col2,
t1.col3,
t1.col4,
t1.col5,
CASE 
    WHEN t1.col1 = '' THEN ‘AA99’
    ELSE t1.col1
END AS column1,
CASE
    WHEN t1.col2 = '' THEN ‘AA99’
    ELSE t1.col2
END AS column2
FROM TABLE1 t1
INNER JOIN TABLE2 t2
ON (t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.col3 = t2.col3 
INNER JOIN TABLE3 t3
ON (t1.col2 = t3.col2)
INNER JOIN TABLE4 t4
ON (t1.col1 = t4.col1 AND t1.col3 = t4.col3)
WHERE (((t1.col1 <> 'NA' OR t1.col1 IS NOT NULL) AND (t2.col1 <> 'NA' OR t2.col1 IS NOT NULL)) 
AND ((t1.col2 <> 'NA' OR t1.col2 IS NOT NULL) AND (t2.col2 <> 'NA' OR t2.col2 IS NOT NULL))
GROUP BY column1,column2 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...