2013-08-06 5 views
0

У нас есть сценарий SQL, который создает CSV, используя следующие:Sub запрос с использованием Oracle 8i

SELECT DISTINCT auf_kopf.auf_nr, TO_CHAR(auf_kopf.erfass_dat,'DD/MM/YYYY'), TO_CHAR(auf_kopf.liefer_dat,'DD/MM/YYYY'), v_ord_custname.cust_name, auf_pos.auf_pos, v_auf_stat_0.anz, v_reason_code_1.reason_code, v_reason_code_1.reason_desc, v_auf_pos_vmat.glas1, auf_pos.glas2, auf_kopf.auf_off, auf_pos.ver_art 
FROM auf_kopf, auf_pos, v_auf_pos_vmat, v_auf_stat_0, v_ord_custname, v_reason_code_1, glas_daten_basis 
WHERE auf_kopf.erfass_dat >sysdate-7 
AND auf_kopf.kopf_reason IS NOT NULL 
AND (auf_kopf.auf_nr=auf_pos.auf_nr(+)) 
AND (auf_pos.auf_nr=v_auf_pos_vmat.auf_nr(+)) 
AND (auf_pos.auf_pos=v_auf_pos_vmat.auf_pos(+)) 
AND (auf_pos.variante=v_auf_pos_vmat.variante(+)) 
AND (auf_pos.auf_nr=v_auf_stat_0.auf_nr) 
AND (auf_pos.auf_pos=v_auf_stat_0.auf_pos) 
AND (auf_pos.variante=v_auf_stat_0.variante) 
AND (auf_kopf.auf_nr=v_ord_custname.order_no) 
AND (auf_kopf.auf_nr=v_reason_code_1.order_no(+)); 

Там есть таблица называется glas_daten_basis, что содержит описания кодов, показанных от v_auf_pos_vmat.glas1 и auf_pos.glas2. Как мы также показываем описание, так как я думаю, что требуется дополнительный запрос, но я не мог заставить его работать.

Нам необходимо glas_daten_basis.gl_bez (описание) для v_auf_pos_vmat.glas1 и auf_pos.glas2. Коды могут быть сопоставлены с использованием glas_daten_basis.idnr и v_auf_pos_vmat.glas1.

+0

Похоже, что стандарт ANSI-89, вероятно, должен быть заменен стандартом ANSI-92 с INNER JOINs. Очень старый и устаревший код ... – twoleggedhorse

+1

@twoleggedhorse - Oracle не добавлял поддержку ANSI-соединений до 9i; если OP действительно использует 8i, то они не являются опцией. Хотя это может быть наименьшее из их проблем ... –

+0

@AlexPoole Какое решение? Можете ли вы отправить пример? – user2656114

ответ

2

Насколько я могу следовать за этим, я думаю, вам просто нужно, чтобы присоединиться к glas_daten_basis дважды:

SELECT DISTINCT auf_kopf.auf_nr, TO_CHAR(auf_kopf.erfass_dat,'DD/MM/YYYY'), 
    TO_CHAR(auf_kopf.liefer_dat,'DD/MM/YYYY'), v_ord_custname.cust_name, 
    auf_pos.auf_pos, v_auf_stat_0.anz, v_reason_code_1.reason_code, 
    v_reason_code_1.reason_desc, 
    v_auf_pos_vmat.glas1 ||' '|| gd_basis1.gl_bez as glas1, 
    auf_pos.glas2 ||' '|| gd_basis2.gl_bez as glas2, 
    auf_kopf.auf_off, auf_pos.ver_art 
FROM auf_kopf, auf_pos, v_auf_pos_vmat, v_auf_stat_0, v_ord_custname, 
    v_reason_code_1, glas_daten_basis gd_basis1, glas_daten_basis gd_basis2 
WHERE auf_kopf.erfass_dat >sysdate-7 
AND auf_kopf.kopf_reason IS NOT NULL 
AND (auf_kopf.auf_nr=auf_pos.auf_nr(+)) 
AND (auf_pos.auf_nr=v_auf_pos_vmat.auf_nr(+)) 
AND (auf_pos.auf_pos=v_auf_pos_vmat.auf_pos(+)) 
AND (auf_pos.variante=v_auf_pos_vmat.variante(+)) 
AND (auf_pos.auf_nr=v_auf_stat_0.auf_nr) 
AND (auf_pos.auf_pos=v_auf_stat_0.auf_pos) 
AND (auf_pos.variante=v_auf_stat_0.variante) 
AND (auf_kopf.auf_nr=v_ord_custname.order_no) 
AND (auf_kopf.auf_nr=v_reason_code_1.order_no(+)) 
AND (v_auf_pos_vmat.glas1 = gd_basis1.idnr(+)) 
AND (auf_pos.glas2 = gd_basis2.idnr(+)); 

Я псевдонимами две ссылки на эту таблицу, чтобы вы могли различать их. Один экземпляр таблицы является внешним, соединенным с v_auf_pos_vmat, а другой - auf_pos. Прошло некоторое время с тех пор, как я использовал старую нотацию (+), но я думаю, что у меня есть они в нужном месте за то, что вы делаете ...

Кстати, скобки вокруг всех условий не нужны, хотя , поскольку нет никакой двусмысленности для решения.

+0

Это сообщение об ошибке получено 'AND (v_auf_pos.glas2 = gd_basis_2.idnr (+)) * ОШИБКА в строке 20: ORA-00904: недопустимое имя столбца'. Можете ли вы помочь? – user2656114

+0

@ user2656114 - Я не соглашался с моими псевдонимами и имел бродячий 'v_'. Однако это должно было жаловаться на имена таблиц, а не на имена столбцов. –

+0

@ user2656114 - обязательно; вы можете конкатенировать значения в точке, в которой вы создаете CSV, но пока я показал, как это сделать в запросе. Эти два значения имеют '|| ' '|| 'между ними, что помещает пробел между ними в конечном значении. И я сгладил их, чтобы потом их можно было назвать. –

Смежные вопросы