Сделал такой:
- Код: Выделить всё
USE investpatents;
SELECT trademarks.ID as tmID, IsJurholder, HolderID, Number,
jurlica.Shortname as JurName, fizlica.Familia as FizName
FROM trademarks
LEFT JOIN jurlica ON (IsJurholder=1 AND HolderID=jurlica.ID)
LEFT JOIN fizlica ON (IsJurholder=0 AND HolderID=fizlica.ID)
WHERE trademarks.ID IN (1,2,3,4,5);
но теперь два разных поля для разных таблиц. Попробую IIF сейчас, спасибо.
Добавлено спустя 39 минут 8 секунд:Re: Помогите упростить SQL запрос (выборка из таблиц с условием)Такой запрос перебирает все значения из таблиц fizlica и jurlicа, и соответственно дублирует много раз все значения из trademarks
Vadim писал(а): Vadim » 21.07.2015 16:14:17
java73
У MSSQL и Firebird есть специальная функция IIF(), которая при выполнении условия возвращает одно значение, а при невыполнении - другое:
КОД: ВЫДЕЛИТЬ ВСЁ
SELECT t.ID as tmID,
IIF(t.IsJurholder=TRUE, j.Shortname, CONCAT(f.Familia,' ',LEFT(f.Name,1),'.',LEFT(f.Otchestvo,1),'.') AS shortname
FROM trademarks t, jurlica j, fizlica f
WHERE t.ID IN (1,2,3,4)
Что получится - проверяйте сами.
Лично я бы воспользовался подзапросами.
Добавлено спустя 10 минут 51 секунду:Re: Помогите упростить SQL запрос (выборка из таблиц с условием)Вот так сработало:
- Код: Выделить всё
USE investpatents;
SELECT DISTINCT t.ID AS tmID, t.HolderID AS th,
CASE t.IsJurholder
WHEN 1 THEN (SELECT Shortname FROM jurlica WHERE ID=th)
WHEN 0 THEN (SELECT Familia FROM fizlica WHERE ID=th) END AS Shortname
FROM trademarks t, jurlica j, fizlica f
WHERE t.ID IN (1,2,3,4,5);
Добавлено спустя 1 час 2 минуты 48 секунд:Re: Помогите упростить SQL запрос (выборка из таблиц с условием)В общем, не смотря на то, что с вашей помощью получилось два работающих SQL запроса, компоненты ZeosDB - ZQuery не хотят понимать их синтаксис.
Сделал в базе MySQL хранимаю процедуру с последним вариантом запроса, где ввел параметр Str (он подставляется в последнюю строку как раз, где IN (....).
Хранимая процедура почему-то возвращает только одну строку (((((((((((((((((((
не подскажете как быть?
Добавлено спустя 33 минуты 35 секунд:Re: Помогите упростить SQL запрос (выборка из таблиц с условием)Заработало все в лазарусе.
В свойстве SQL нужно прямо указывать базу данных перед таблицей:
- Код: Выделить всё
DM1.TMSelected.SQL.Add('SELECT DISTINCT trademarks.Number, CASE trademarks.IsJurholder');
DM1.TMSelected.SQL.Add('WHEN 1 THEN (SELECT Shortname FROM investpatents.jurlica WHERE ID=HolderID)');
DM1.TMSelected.SQL.Add('WHEN 0 THEN (SELECT CONCAT(Familia,'' '',LEFT(Name,1),''.'',LEFT(Otchestvo,1),''.'') FROM investpatents.fizlica WHERE ID=HolderID)');
DM1.TMSelected.SQL.Add('END AS Shortname FROM investpatents.trademarks, investpatents.jurlica, investpatents.fizlica');
DM1.TMSelected.SQL.Add('WHERE trademarks.ID IN ('+ID+')');
DM1.TMSelected.Open;