Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Про связанные таблицы с фильтром

3.1K
15 января 2003 года
vymyatnin
2 / / 15.01.2003
Про связанные таблицы с фильтром

Есть две таблицы: 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;
2.5K
16 января 2003 года
john
6 / / 29.10.2002
Цитата:
Originally posted by vymyatnin
Про связанные таблицы с фильтром

Есть две таблицы: 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

3.1K
16 января 2003 года
vymyatnin
2 / / 15.01.2003
Цитата:
Originally posted by john


Выкинь свой 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;

2.5K
20 января 2003 года
john
6 / / 29.10.2002
Цитата:
Originally posted by vymyatnin


Пробовал (см. ниже) - результат тот же.
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)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог