Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2012, 13:02   #1
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
Вопрос Как работает inner join при неудовлетворении условия?

Подскажите, пожалуйста, как в SQL FB2.5 написать код правильно? Есть нечто такое:
Код:
select *
  from TableX
  inner join SP (InputID) on TableX.ID=SP.ID and ((select ParamP from TableP where ID=:InputID)=1)
  left join TableY on TableX.idX=TableY.idX
Смысл задачи - в случае неудовлетворения некоего условия (ParamP=0) вообще не делать inner join с ХП возвращающей некий список, пропустить этот inner join, чтобы результатом всей выборки была полная таблица TableX + последующие left join.
Минусом написанного кода является необходимость дополнительного "select paramP..." для каждой строки TableX, можно ли как-то оптимизировать?
(Делать проверку в написанной выше выборке в самом начале перед основным select*from и сохранять во временную переменную (select ParamP from TableP where ID=:InputID into ParamTempResult), а затем в строке inner join проверять уже ParamTempResult=1 можно было бы, если бы эта вся выборка была ХП, но если это разово запускаемый SQL-код не являющийся ХП - временные переменные использовать нельзя, поэтому такой вариант не подходит.)
1. Как вообще отработает строка с inner join если указанное условие (в скобках) не удовлетворено?: а) результат всей выборки будет пустым (произойдёт объединение inner join TableX + null)? б) или при неудовлетворении условия просто строка inner join пропускается, и произойдёт объединение по второй строке: TableX + left join TableY ?
2. В принципе проверку условия (if (select ParamP from TableP where ID=:InputID)=1 then exit) можно перенести в саму SP, но тогда как отработает в написанной выше выборке строка с inner join если указанная ХП-таблица (SP) вернёт 0 строк? (пустой ответ): а) объединение inner join сработает с 0 строк и общим результатом будет 0 строк? б) объединение inner join сработает с 0 строк и общим результатом будут все строки TableX? в) или inner join будет пропущено?
3. Есть ли в FB2.5 возможность как-то написать [inner join SP (Param1) on TableX.id=SP.id and SP.rowcount>0] ? (пробовал так, [row_count(SP)>0], [SP is not null], [select count(*) from SP >0], [(select count(*) as cnt from SP) cnt is not null] - IBexpert всё время ругается на неверный синтаксис)
4. Есть ли какая-то разница между inner join и cross join ?

Последний раз редактировалось DeveloPerchik; 14.04.2012 в 16:14.
DeveloPerchik вне форума Ответить с цитированием
Старый 14.04.2012, 15:31   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

from t1
inner join z2 on ( условиЯ )...

к каждой строке t1 приосединяются ВСЕ строки из z2 ДЛЯ КОТОРЫХ выполненЫ условиЯ.
если какой-то строке из t1 найдется несколько (K) строк в z2, в результате будет несколько (K) строк с одинаковой частью t1 и разными вариантами z2.
inner вводятся те НАБОРЫ строк в которых есть И часть t1 и часть z2.
left выводятся все стрки t1 с возможными (для этой строки) твариантами z2
right все строки z2 c возможными (для этой строки) вариантами t1
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.04.2012, 16:07   #3
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Спасибо, но это всё очевидно и не даёт решения поставленной задачи...
Я слегка подкорректировал топик, чтобы было проще вникать в задачу, возможно Вы сможете ответить хотя бы на вопросы 2-3 ?

Последний раз редактировалось DeveloPerchik; 14.04.2012 в 16:27.
DeveloPerchik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли как-то сделать if для join в FB2.5? DeveloPerchik БД в Delphi 6 10.04.2012 11:32
inner join/full join SashkaSonin БД в Delphi 6 23.03.2012 17:13
КАк сделать JOIN в Access с объединением по NULL Izhic Помощь студентам 1 09.02.2011 11:18
Как скрыть строку при выполнении условия в другой ячейке Алексей777 Microsoft Office Excel 4 09.12.2010 10:06
INNER JOIN в Delphi не работает. Droid БД в Delphi 2 03.07.2009 12:30