Про связанные таблицы с фильтром
Есть две таблицы: LOG_Hole.dbf и LOG_List.dbf.
LOG_Hole.dbf - это таблица с данными
LOG_List.dbf - это таблица-справочник или LookUp-таблица (кодом является поле POLE_N, название берется из поля POLE_RF. При этом в таблице хранятся как справочники разные понятия (например, страна, район, фамилия и т.п.), а поле LIST при этом используется как фильтр для отбора записей определенного понятия).
В таблице LOG_Hole.dbf поля POLE_P, POLE_T и CONSTR являются справочными полями, т.е. это коды названий из таблицы LOG_List.dbf. Эти поля связаны с таблицей LOG_List.dbf через поле POLE_N, а название надо брать из поля POLE_RF.
При этом есть условие:
для поля POLE_P на таблицу LOG_List.dbf накладывается фильтр LIST=1
для поля POLE_T на таблицу LOG_List.dbf накладывается фильтр LIST=3
для поля CONSTR на таблицу LOG_List.dbf накладывается фильтр LIST=23
Это значит, что когда код из поля POLE_P (таблица LOG_Hole.dbf) ищется в поле POLE_N (таблица LOG_List.dbf), чтобы взять текст из поля POLE_RF (таблица LOG_List.dbf) надо на таблицу LOG_List.dbf наложить фильтр по полю LIST: LIST=1 (аналогично и для полей POLE_T и CONSTR)
ВОПРОС:
Как сформировать SQL-запрос для выдачи всех полей из таблицы LOG_Hole.dbf, но при этом коды из справочных полей заменить на названия из таблицы-справочника (и при этом не забыть про фильтр для разных понятий)?
Запрос (см. ниже) работает, но при выдает только те записи, в которых есть значения для всех трех полей POLE_P, POLE_T, CONSTR из таблицы LOG_Hole.dbf. А надо, чтобы выдавались все записи, в которых есть данные хотя бы по одному из полей.
SELECT
PL_1.'POLE_RF',
PL_2.'POLE_RF',
PL_3.'POLE_RF'
FROM
'LOG_Hole',
'LOG_List' AS PL_1,
'LOG_List' AS PL_2,
'LOG_List' AS PL_3
WHERE
'LOG_Hole'.'POLE_P'=PL_1.'POLE_N' AND PL_1.LIST=1 AND
'LOG_Hole'.'POLE_T'=PL_2.'POLE_N' AND PL_2.LIST=3 AND
'LOG_Hole'.'CONSTR'=PL_3.'POLE_N' AND PL_3.LIST=37;
Про связанные таблицы с фильтром
Есть две таблицы: LOG_Hole.dbf и LOG_List.dbf.
LOG_Hole.dbf - это таблица с данными
LOG_List.dbf - это таблица-справочник или LookUp-таблица (кодом является поле POLE_N, название берется из поля POLE_RF. При этом в таблице хранятся как справочники разные понятия (например, страна, район, фамилия и т.п.), а поле LIST при этом используется как фильтр для отбора записей определенного понятия).
В таблице LOG_Hole.dbf поля POLE_P, POLE_T и CONSTR являются справочными полями, т.е. это коды названий из таблицы LOG_List.dbf. Эти поля связаны с таблицей LOG_List.dbf через поле POLE_N, а название надо брать из поля POLE_RF.
При этом есть условие:
для поля POLE_P на таблицу LOG_List.dbf накладывается фильтр LIST=1
для поля POLE_T на таблицу LOG_List.dbf накладывается фильтр LIST=3
для поля CONSTR на таблицу LOG_List.dbf накладывается фильтр LIST=23
Это значит, что когда код из поля POLE_P (таблица LOG_Hole.dbf) ищется в поле POLE_N (таблица LOG_List.dbf), чтобы взять текст из поля POLE_RF (таблица LOG_List.dbf) надо на таблицу LOG_List.dbf наложить фильтр по полю LIST: LIST=1 (аналогично и для полей POLE_T и CONSTR)
ВОПРОС:
Как сформировать SQL-запрос для выдачи всех полей из таблицы LOG_Hole.dbf, но при этом коды из справочных полей заменить на названия из таблицы-справочника (и при этом не забыть про фильтр для разных понятий)?
Запрос (см. ниже) работает, но при выдает только те записи, в которых есть значения для всех трех полей POLE_P, POLE_T, CONSTR из таблицы LOG_Hole.dbf. А надо, чтобы выдавались все записи, в которых есть данные хотя бы по одному из полей.
SELECT
PL_1.'POLE_RF',
PL_2.'POLE_RF',
PL_3.'POLE_RF'
FROM
'LOG_Hole',
'LOG_List' AS PL_1,
'LOG_List' AS PL_2,
'LOG_List' AS PL_3
WHERE
'LOG_Hole'.'POLE_P'=PL_1.'POLE_N' AND PL_1.LIST=1 AND
'LOG_Hole'.'POLE_T'=PL_2.'POLE_N' AND PL_2.LIST=3 AND
'LOG_Hole'.'CONSTR'=PL_3.'POLE_N' AND PL_3.LIST=37;
Выкинь свой where а таблицы свяжи через join
Выкинь свой where а таблицы свяжи через join
Пробовал (см. ниже) - результат тот же.
SELECT
PL_1.'POLE_RF',
PL_2.'POLE_RF',
PL_3.'POLE_RF'
FROM
((('LOG_Hole'
LEFT OUTER JOIN 'LOG_List' AS PL_1 ON 'LOG_Hole'.'POLE_P'=PL_1.'POLE_N')
LEFT OUTER JOIN 'LOG_List' AS PL_2 ON 'LOG_Hole'.'POLE_T'=PL_2.'POLE_N')
LEFT OUTER JOIN 'LOG_List' AS PL_3 ON 'LOG_Hole'.'CONSTR'=PL_3.'POLE_N')
WHERE
PL_1.LIST=1
AND PL_2.LIST=3
AND PL_3.LIST=37;
Пробовал (см. ниже) - результат тот же.
SELECT
PL_1.'POLE_RF',
PL_2.'POLE_RF',
PL_3.'POLE_RF'
FROM
((('LOG_Hole'
LEFT OUTER JOIN 'LOG_List' AS PL_1 ON 'LOG_Hole'.'POLE_P'=PL_1.'POLE_N')
LEFT OUTER JOIN 'LOG_List' AS PL_2 ON 'LOG_Hole'.'POLE_T'=PL_2.'POLE_N')
LEFT OUTER JOIN 'LOG_List' AS PL_3 ON 'LOG_Hole'.'CONSTR'=PL_3.'POLE_N')
WHERE
PL_1.LIST=1
AND PL_2.LIST=3
AND PL_3.LIST=37;
Попробуй так
SELECT
PL_1.'POLE_RF',
PL_2.'POLE_RF',
PL_3.'POLE_RF'
FROM
((('LOG_Hole'
LEFT OUTER JOIN 'LOG_List' AS PL_1 ON 'LOG_Hole'.'POLE_P'=PL_1.'POLE_N' and pl_1.list=1)
LEFT OUTER JOIN 'LOG_List' AS PL_2 ON 'LOG_Hole'.'POLE_T'=PL_2.'POLE_N' and pl_2.list=3)
LEFT OUTER JOIN 'LOG_List' AS PL_3 ON 'LOG_Hole'.'CONSTR'=PL_3.'POLE_N' and pl_3.list=37)