Проблемы с SQL запросом | |
---|---|
Димон Автор Сообщений: 59 Откуда: Сеть Дата регистрации: 04.09.2000 |
Есть вот такой запрос
SELECT * FROM operate!owners LEFT JOIN operate!status; LEFT JOIN operate!bank; ON Owners.статус = Status.Masterkey; ON Owners.мастер_банка = Bank.masterkey ; WHERE Owners.masterkey=ln_Mst INTO CURSOR ANK_TMP Проблема в том, что если в одной из присоединенных таблиц STATUS или BANK нет записей удовлетворяющих запросу то запрос не выполняется в части присоединенных таблиц. Т.е. если OWNERS.STATUS=1 и в таблице STATUS есть запись с MASTERKEY=1, а OWNERS.МАСТЕР_БАНКА=1 и в BANK нет записи с MASTERKEY=1 то все значения возвращаемые из статус NULL. Хотя должны быть NULL только для полей BANK. Целый день мучаюсь, Димон. |
RE: Проблемы с SQL запросом | |
---|---|
ВладимирМ Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
1. При использовании опции JOIN важен ПОРЯДОК вызова таблиц. Я так понимаю, что ты хочешь получить ВСЕ записи из таблицы owners и дочерние записи из других таблиц. Возможны 2 варианта решения проблемы:
а) ... status Right Join owners Left Join bank б) насколько я вижу, ты создал запрос через дизайнер, так вот дизайнер с JOIN формирует НЕВЕРНЫЙ синтаксис. Должно быть: ... owners LEFT JOIN status ON ... LEFT JOIN bank ON ... т.е. ключевое слово "ON" СРАЗУ за "JOIN", нельзя несколько "JOIN", а затем несколько "ON", в противном случае SQL может не понять "кто на ком стоял" 2. Ну и проверь SET COLLATE TO "MACHINE", дело в том, что при использовании запросов из нескольких таблиц НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ SET COLLATE TO "RUSSIAN", в противном случае ты рискуешь потерять часть записей в выборке. |
Точно! И еще вопросик. | |
---|---|
Димон Автор Сообщений: 59 Откуда: Сеть Дата регистрации: 04.09.2000 |
Абсолютно точно. Переставил за каждым LEFT JOIN свой ON и все заработало. Большое спасибо. Есть еще один вопрос. Если в связанной таблице нет записи то в результате возвращается значение NULL. Как запретить NULL значения, т.е. чтобы просто возвращалось пустое значение.
SET NULL OFF ставил - не помогает. Димон. |
set nulldisplay to | |
---|---|
Игорь Ильин |
set nulldisplay to ""
Если нужны действительно пустые записи (которые не выглядят пробелами, а являются ими), можно попробовать такую конструкцию select iif( isnull(table1.field1), space(20), table1.field1 ) ... from ... left join ... 20 - это длина поля table1.field1(иначе могут возникнуть сложности) P.S. Идею на работоспособность не проверял |
К вопросу о NULL | |
---|---|
ВладимирМ Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Дело в том, что по умолчанию убрать NULL не получится. Есть 2 способа решения:
1. Выполнить запрос, а затем REPLACE FOR IsNull(MyField) MyField with "" 2. В запросе, вместо имени поля указать функцию, например: SELECT nvl(MyField,"") as MyField from MyTable NVL() - возвращает первое из 2 значений отличное от NULL или можешь ипользовать IIF() и IsNull() |
© 2000-2024 Fox Club  |