2015-04-22 5 views
0

Я не понимаю, почему я могу это сделать:Почему я не могу выбрать мой внутренний стол?

SELECT YEAR(CREATION_TIME) AS y, MONTH(CREATION_TIME) as m, COUNTRY_CODE 
FROM PRODUCTS INNER JOIN COMPANIES 
ON COMPANIES.COMPANY_KEY = PRODUCTS.CUSTOMER_ID 
WHERE CREATED_BY IN ('VOLVO','SAAB') 

Но не

SELECT y FROM 
(
    SELECT YEAR(CREATION_TIME) AS y, MONTH(CREATION_TIME) AS m, COUNTRY_CODE 
    FROM PRODUCTS INNER JOIN COMPANIES 
    ON COMPANIES.COMPANY_KEY = PRODUCTS.CUSTOMER_ID 
    WHERE CREATED_BY IN ('VOLVO','SAAB') 
) 

Я получаю следующее сообщение об ошибке:

Error: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=;;CORRELATION NAME, DRIVER=3.53.70 SQLState: 42601 ErrorCode: -104 Error: DB2 SQL Error: SQLCODE=-514, SQLSTATE=26501, SQLERRMC=SQL_CURLH200C1, DRIVER=3.53.70 SQLState: 26501 ErrorCode: -514

Моя конечная цель, однако, сделать что-то например:

SELECT y, m, COUNTRY_CODE, count(*) 
FROM 
(
    SELECT YEAR(CREATION_TIME) AS y, MONTH(CREATION_TIME) AS m, COUNTRY_CODE 
    FROM PRODUCTS INNER JOIN COMPANIES 
    ON COMPANIES.COMPANY_KEY = PRODUCTS.CUSTOMER_ID 
    WHERE CREATED_BY IN ('VOLVO','SAAB') 
) 
GROUP BY y, m, COUNTRY_CODE 
+1

Не знаю о db2, но попробуйте указать псевдоним для вашего подзапроса. Что-то вроде SELECT y FROM (...) как T – ericpap

+0

Сторона примечания - группировка по извлеченным году и месяцу таким образом будет игнорировать индексы. Присоединение к виртуальной/постоянной таблице календаря может привести к повышению производительности (и исключить необходимость обертывания этой части запроса). Постоянные таблицы календаря смехотворно полезны для такого рода вещей. –

ответ

1

У вас должна быть действительно старая версия DB2. В какой-то момент для подзапросов потребовалось имя корреляции, поэтому попробуйте следующее:

SELECT t.y FROM 
(
    SELECT YEAR(CREATION_TIME) AS y, MONTH(CREATION_TIME) AS m, COUNTRY_CODE 
    FROM PRODUCTS INNER JOIN COMPANIES 
    ON COMPANIES.COMPANY_KEY = PRODUCTS.CUSTOMER_ID 
    WHERE CREATED_BY IN ('VOLVO','SAAB') 
) AS t 
+0

Хороший ответ^^ –

+0

Работал отлично, спасибо. Ответ идет вам. Так близко @TimBiegeleisen;) –

+0

Он также может быть на z/OS. Даже в версии 11 у вас должен быть псевдоним. Им не нравятся изменения на мэйнфрейме ... – bhamby

1

Ваш синтаксис во втором запросе неверен. Вы не можете ссылаться на псевдоним столбца, не ссылаясь также на таблицу. Это должно работать:

SELECT t.y FROM 
(
    SELECT YEAR(CREATION_TIME) AS y, MONTH(CREATION_TIME) AS m, COUNTRY_CODE 
    FROM PRODUCTS INNER JOIN COMPANIES 
    ON COMPANIES.COMPANY_KEY = PRODUCTS.CUSTOMER_ID 
    WHERE CREATED_BY IN ('VOLVO','SAAB') 
) AS t 
Смежные вопросы