powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не получается вывести строки, которых нет в одной из таблиц
25 сообщений из 35, страница 1 из 2
Не получается вывести строки, которых нет в одной из таблиц
    #40016696
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток уважаемые

У меня есть 2 БД, первая ' BD0 ' в которой хранится оборудование с таблицей « EQUIPMENT », и ' BD1 ' в которой хранятся сертификаты к этому оборудованию (может быть несколько сертификатов к одному оборудованию с разными датами). в таблице « CERTIFICATE ».

В DataSet подключенной к BD0 , я пишу запрос (см. ниже), которым хочу выбрать все оборудование, с просроченными сертификатами на текущую дату, а также оборудование у которого нет межкалибровочного интервала (eq.CALIBRATION_INTERVAL ). Т.е. в таблице « CERTIFICATE » в поле DATE_OUT – это выдача сертификата, я в запросе прибавляю например 12 месяцев ( eq.CALIBRATION_INTERVAL = 12 , которые хранятся) в таблице «EQUIPMENT» и сравниваю с текущей датой. Сертификаты я достаю с помощью «procedure LAST_CERT»

Все работало нормально, но захотелось при этом выводить оборудование у которого вообще в таблице « CERTIFICATE » нет данных , т.е. нет сертификатов и тут начались проблемы с JOIN я не могу присоеденить к « EQUIPMENT » строки которых не выдает LAST_CERT. Конечно оно по логике должно соединятся и выводить. Но мешает условие « and lc.LAST_DATE is not null ». А без него выводятся вообще все оборудование
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
EXECUTE BLOCK RETURNS
….
AS  declare variable ID_EQUIP integer; 
declare variable LAB_ID integer;
declare variable COUNT_REC integer;
declare variable CALIBR_INT integer;


declare procedure LAST_CERT(ID_EQUIP integer, CALIBR_INT integer) 
   returns(NUMBER_CERT varchar(25), LAST_DATE date, DEVICE_ID_CL integer, COUNT_REC integer) 
as  begin
  if (:CALIBR_INT is null) 
    then :CALIBR_INT = -1;
   
    for execute statement
      'SELECT ce.NUMBER_CERT, ce.DATE_OUT, ce.DEVICE_ID_CL FROM CERTIFICATE ce  left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in ('||ID_EQUIP||') and (DATEADD(month, '||CALIBR_INT||', ce.DATE_OUT)<current_date)'
     on external '…\BD1.fdb'  as user 'SYSDBA' password 'masterkey'
        into :NUMBER_CERT, :LAST_DATE, :DEVICE_ID_CL  do suspend;

end


     begin 
        for select eq.ID, eq.HOST_LABORATORY, eq.CALIBRATION_INTERVAL
           from EQUIPMENT eq where ARCHIVE in (1) and PASSPORT = 1
               order by eq.NAME, eq."TYPE", eq.NUMBER, eq.NEMBER_INVENTORY
                   into :ID_EQUIP, :LAB_ID, :CALIBR_INT

      do for 
         select eq.ID, eq.NAME, eq."TYPE", eq.NUMBER, eq.NEMBER_INVENTORY, eq.PRODUCER, eq.YEAR_BEGIN, eq.CALIBRATION_INTERVAL, eq.NAME_TEST, eq.REMARK,
             eq.USER_ID, eq.DEPARTMENT_ID, eq.TIME_EDIT, eq.ARCHIVE, eq.SPECIFICATION, eq.DEVICE_DEPARTMENT_ID, eq.TYPE_SERIES, eq.DISLOCATION,                eq.TYPE_EQUIP, eq.PASSPORT, eq.HOST_LABORATORY, eq.HOST_USER, eq.COUNT_CERT, rl.NAME_SHORT_LAB, lc.NUMBER_CERT, lc.LAST_DATE 
           from EQUIPMENT eq
             left join RECIEVE_LAB(:LAB_ID) rl on rl.id = eq.HOST_LABORATORY
             left join LAST_CERT(:ID_EQUIP, :CALIBR_INT) lc on eq.ID = lc.DEVICE_ID_CL
               where eq.ID = :ID_EQUIP
 and lc.LAST_DATE is not null            //помогает избавится от записей не удовлетворяющих условию даты сертификата
  or lc.DEVICE_ID_CL is null   //по идее должно выводить те строки "EQUIPMENT", которых нет в табл. «CERTIFICATE»

                   into ID, NAME, "TYPE", NUMBER, NEMBER_INVENTORY, PRODUCER, YEAR_BEGIN, CALIBRATION_INTERVAL, NAME_TEST, REMARK, USER_ID, DEPARTMENT_ID, TIME_EDIT, ARCHIVE,
                     SPECIFICATION, DEVICE_DEPARTMENT_ID, TYPE_SERIES, DISLOCATION, TYPE_EQUIP, PASSPORT, HOST_LABORATORY, HOST_USER, COUNT_CERT, NAME_SHORT_LAB, NUMBER_CERT, LAST_DATE do suspend; END



Но новые записи, т.е. то оборудование у которого нет сертификатов к существующему результату не добавилось.

Как бы мне модернизировать запрос?
Заранее спасибо за ответ
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016697
Dimbuch®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скобки забыли

Код: sql
1.
2.
and (lc.LAST_DATE is not null   
  or lc.DEVICE_ID_CL is null)
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016699
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimbuch®
Скобки забыли

Код: sql
1.
2.
and (lc.LAST_DATE is not null   
  or lc.DEVICE_ID_CL is null)


да скобки помогли отчасти (записи в резльтате перестали множится)

но всеравно в общий результат почему-то попадают лишние строки, т.е. в процедуре LAST_CERT , в запросе перестало выполняться условие. и в результате выбирает всю таблицу EQUIPMENT
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016700
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010
в процедуре LAST_CERT , в запросе перестало выполняться условие. и в результате выбирает всю таблицу EQUIPMENT

уточню
уловие
"..and lc.LAST_DATE is not null.."

перестало работать
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016702
Dimbuch®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kos-2010,

Надо в проверять на пустоту в таблице сертификатов поле, которое обязательно должно быть заполнено. Например, NUMBER_CERT

Я так понял, что lc.DEVICE_ID_CL может быть пустым даже при наличии сертификата
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016703
Dimbuch®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimbuch®,

Тогда надо поставить условие по дате внутрь джоина
Код: sql
1.
2.
3.
4.
5.
6.
7.
left join LAST_CERT(:ID_EQUIP, :CALIBR_INT) lc
  on eq.ID = lc.DEVICE_ID_CL 
  and lc.LAST_DATE is not null


-- А это вообще убрать
-- or lc.DEVICE_ID_CL is null
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016704
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimbuch®,

поле "lc.DEVICE_ID_CL" (в таблице "CERTIFICATE ") это "ID" оборудования в таблице "EQUIPMENT" - и оно всегда заполнено.
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016705
Dimbuch®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну тогда так. Не знаю как еще склеить INNER и LEFT JOIN

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
         select eq.ID, eq.NAME, eq."TYPE", eq.NUMBER, eq.NEMBER_INVENTORY, eq.PRODUCER, eq.YEAR_BEGIN, eq.CALIBRATION_INTERVAL, eq.NAME_TEST, eq.REMARK,
             eq.USER_ID, eq.DEPARTMENT_ID, eq.TIME_EDIT, eq.ARCHIVE, eq.SPECIFICATION, eq.DEVICE_DEPARTMENT_ID, eq.TYPE_SERIES, eq.DISLOCATION,                eq.TYPE_EQUIP, eq.PASSPORT, eq.HOST_LABORATORY, eq.HOST_USER, eq.COUNT_CERT, rl.NAME_SHORT_LAB, lc.NUMBER_CERT, lc.LAST_DATE 
           from EQUIPMENT eq
             left join RECIEVE_LAB(:LAB_ID) rl on rl.id = eq.HOST_LABORATORY
             INNER join LAST_CERT(:ID_EQUIP, :CALIBR_INT) lc on eq.ID = lc.DEVICE_ID_CL
                and lc.LAST_DATE is not null            //помогает избавится от записей не удовлетворяющих условию даты сертификата
               where eq.ID = :ID_EQUIP
 

UNION ALL

         select eq.ID, eq.NAME, eq."TYPE", eq.NUMBER, eq.NEMBER_INVENTORY, eq.PRODUCER, eq.YEAR_BEGIN, eq.CALIBRATION_INTERVAL, eq.NAME_TEST, eq.REMARK,
             eq.USER_ID, eq.DEPARTMENT_ID, eq.TIME_EDIT, eq.ARCHIVE, eq.SPECIFICATION, eq.DEVICE_DEPARTMENT_ID, eq.TYPE_SERIES, eq.DISLOCATION,                eq.TYPE_EQUIP, eq.PASSPORT, eq.HOST_LABORATORY, eq.HOST_USER, eq.COUNT_CERT, rl.NAME_SHORT_LAB, lc.NUMBER_CERT, lc.LAST_DATE 
           from EQUIPMENT eq
             left join RECIEVE_LAB(:LAB_ID) rl on rl.id = eq.HOST_LABORATORY
             left join LAST_CERT(:ID_EQUIP, :CALIBR_INT) lc on eq.ID = lc.DEVICE_ID_CL
               where eq.ID = :ID_EQUIP
  AND lc.DEVICE_ID_CL is null   //по идее должно выводить те строки "EQUIPMENT", которых нет в табл. «CERTIFICATE»
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016706
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimbuch®,

Спасибо, будем пробовать...
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016708
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimbuch®,

почему-то запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
select eq.ID, eq.NAME, eq."TYPE", eq.NUMBER, eq.NEMBER_INVENTORY, eq.PRODUCER, eq.YEAR_BEGIN, eq.CALIBRATION_INTERVAL, eq.NAME_TEST, eq.REMARK,
             eq.USER_ID, eq.DEPARTMENT_ID, eq.TIME_EDIT, eq.ARCHIVE, eq.SPECIFICATION, eq.DEVICE_DEPARTMENT_ID, eq.TYPE_SERIES, eq.DISLOCATION,                eq.TYPE_EQUIP, eq.PASSPORT, eq.HOST_LABORATORY, eq.HOST_USER, eq.COUNT_CERT, rl.NAME_SHORT_LAB, lc.NUMBER_CERT, lc.LAST_DATE 
           from EQUIPMENT eq
             left join RECIEVE_LAB(:LAB_ID) rl on rl.id = eq.HOST_LABORATORY
             left join LAST_CERT(:ID_EQUIP, :CALIBR_INT) lc on eq.ID = lc.DEVICE_ID_CL
               where eq.ID = :ID_EQUIP
  AND lc.DEVICE_ID_CL is null



который должен по идее выбирать записи оборудования у которых нет сертификтов не хочет работать
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40016979
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос:
как правильно обработать результат процедуры LAST_CERT, которая ни чего не выдает?

Потому что
Код: sql
1.
AND lc.DEVICE_ID_CL is null


не корректно работает,
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40017656
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всетаки решил переделать немного процедуру LAST_CERT , в самом скрипте, раньше я пробовал создать 2 запроса в процедуре, но у меня не получилось...

т.е. первым скриптом я считаю строки которые подходят условию
и если подходят (т.е. количество строк <> 0), то выбираю данные из CERTIFICATE - вторым скриптом
но если результат первого скрипта = 0,
я присваиваю

Код: sql
1.
2.
3.
:NUMBER_CERT = -1;
:LAST_DATE = null;
:DEVICE_ID_CL = -1;


я создал внутреннюю отдельную процедуру и она работает.
но когда я ее вставил в скрипт, выкидывает синтаксическую ошибку:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Execute statement error at isc_dsql_prepare :
335544569 : Dynamic SQL Error
335544436 : SQL error code = -104
335544634 : Token unknown - line 3, column 52
335544382 : into
Statement : SELECT count(*) FROM CERTIFICATE ce left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT
where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in (433)
and (DATEADD(month, 12, ce.DATE_OUT)<current_date) into :COUNT_REC;
Data source : Firebird::D:\Database\Plan.fdb.
At sub procedure 'LAST_CERT' line: 20, col: 4
At block line: 48, col: 10.

сам скрипт:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
   declare procedure LAST_CERT(ID_EQUIP integer, CALIBR_INT integer)
     returns(NUMBER_CERT varchar(25), LAST_DATE date, DEVICE_ID_CL integer)
      as begin

if (:CALIBR_INT is null) then :CALIBR_INT = -1;
   for execute statement

   'SELECT count(*) FROM CERTIFICATE ce left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT
   where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in ('||ID_EQUIP||')
and (DATEADD(month, '||CALIBR_INT||', ce.DATE_OUT)<current_date) into :COUNT_REC;

   if (:COUNT_REC <> 0) then
     SELECT ce.NUMBER_CERT, ce.DATE_OUT, ce.DEVICE_ID_CL FROM CERTIFICATE ce
        left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT
      where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in ('||ID_EQUIP||')
             and (DATEADD(month, '||CALIBR_INT||', ce.DATE_OUT)<current_date)
               into :NUMBER_CERT, LAST_DATE, :DEVICE_ID_CL;
   else
      begin
    :NUMBER_CERT = -1;
    :LAST_DATE = null;
    :DEVICE_ID_CL = -1;
   end'
  on external 'D:\Database\Plan.fdb'  as user 'SYSDBA' password 'masterkey'
  into :NUMBER_CERT, :LAST_DATE, :DEVICE_ID_CL
       do suspend;
     end


Не подскажите где, тут ошибка?
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40017684
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010

я создал внутреннюю отдельную процедуру и она работает.
но когда я ее вставил в скрипт, выкидывает синтаксическую ошибку:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Execute statement error at isc_dsql_prepare :
335544569 : Dynamic SQL Error
335544436 : SQL error code = -104
335544634 : Token unknown - line 3, column 52
335544382 : into
Statement : SELECT count(*) FROM CERTIFICATE ce left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT
where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in (433)
and (DATEADD(month, 12, ce.DATE_OUT)<current_date) into :COUNT_REC;
Data source : Firebird::D:\Database\Plan.fdb.
At sub procedure 'LAST_CERT' line: 20, col: 4
At block line: 48, col: 10.

сам скрипт:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
   declare procedure LAST_CERT(ID_EQUIP integer, CALIBR_INT integer)
     returns(NUMBER_CERT varchar(25), LAST_DATE date, DEVICE_ID_CL integer)
      as begin

if (:CALIBR_INT is null) then :CALIBR_INT = -1;
   for execute statement

   'SELECT count(*) FROM CERTIFICATE ce left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT
   where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in ('||ID_EQUIP||')
and (DATEADD(month, '||CALIBR_INT||', ce.DATE_OUT)<current_date) into :COUNT_REC;

   if (:COUNT_REC <> 0) then
     SELECT ce.NUMBER_CERT, ce.DATE_OUT, ce.DEVICE_ID_CL FROM CERTIFICATE ce
        left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT
      where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in ('||ID_EQUIP||')
             and (DATEADD(month, '||CALIBR_INT||', ce.DATE_OUT)<current_date)
               into :NUMBER_CERT, LAST_DATE, :DEVICE_ID_CL;
   else
      begin
    :NUMBER_CERT = -1;
    :LAST_DATE = null;
    :DEVICE_ID_CL = -1;
   end'
  on external 'D:\Database\Plan.fdb'  as user 'SYSDBA' password 'masterkey'
  into :NUMBER_CERT, :LAST_DATE, :DEVICE_ID_CL
       do suspend;
     end


Не подскажите где, тут ошибка?


INTO надо вынести из стейтмента.

В execute statement 2 стейтмента, их надо разделить, что-то типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
   for execute statement

   'SELECT count(*) FROM CERTIFICATE ce left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT
   where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in ('||ID_EQUIP||')
and (DATEADD(month, '||CALIBR_INT||', ce.DATE_OUT)<current_date)'
  on external data source 'D:\Database\Plan.fdb'  as user 'SYSDBA' password 'masterkey'
  into :COUNT_REC
  do
  begin
    if (:COUNT_REC <> 0) then
      execute statement
      'SELECT ce.NUMBER_CERT, ce.DATE_OUT, ce.DEVICE_ID_CL FROM CERTIFICATE ce
         left join CERTIFICATE b on ce.DEVICE_ID_CL = b.DEVICE_ID_CL and ce.DATE_OUT < b.DATE_OUT
       where b.DEVICE_ID_CL is NULL and ce.DEVICE_ID_CL in ('||ID_EQUIP||')
              and (DATEADD(month, '||CALIBR_INT||', ce.DATE_OUT)<current_date)'
      on external data source 'D:\Database\Plan.fdb'  as user 'SYSDBA' password 'masterkey'
        into :NUMBER_CERT, LAST_DATE, :DEVICE_ID_CL;
    else
    begin
      NUMBER_CERT = -1;
      LAST_DATE = null;
      DEVICE_ID_CL = -1;
    end

    suspend;
  end
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40017698
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

Спасибо, большое. получилось...
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40017727
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010
Polesov,

Спасибо, большое. получилось...


Запрос
Код: sql
1.
SELECT count(*) FROM

вернет одну запись. Зачем использовать for execute statement?

Запрос
Код: sql
1.
SELECT ce.NUMBER_CERT, ce.DATE_OUT, ce.DEVICE_ID_CL FROM

может вернуть более одной записи, поэтому лучше использовать for execute statement, иначе будет ошибка " multiple rows in singleton select ".
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40017748
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

кроме всего прочего, человек пытается еще и псевдо-ссылочную псевдо-целостность организовать.
Оборудование в одной базе, а сертификаты в другой.
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40017751
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,
ну, всех нюансов схемы хранения данных отсюда не видно.

И вообще, вполне может быть, что автору топика базы "достались в наследство" )
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40017795
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
Оборудование в одной базе, а сертификаты в другой.
Вполне себе житейская конструкция, кстати.

Блобы оне зело тяжелые, места много надо, прогнать через б-р 500 гиг разом или 200+300, да на разных серверах задача заметно облегчается, времени требуется гораздо меньше.
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40017807
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010, Polesov

22231055

если используется 3.0, то задействуем COUNT(*) OVER() и после чего брюки превращаются вместо двух EXECUTE STATEMENT ON EXTERNAL можно использовать один

Далее с EXECUTE STATEMENT можно использовать параметры, вместо сборки запроса.
Поскольку у вас ID_EQUIP integer, то IN использовать не имеет смысла, достаточно =
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40017844
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Kos-2010, Polesov

22231055

если используется 3.0, то задействуем COUNT(*) OVER() и после чего брюки превращаются вместо двух EXECUTE STATEMENT ON EXTERNAL можно использовать один

Далее с EXECUTE STATEMENT можно использовать параметры, вместо сборки запроса.
Поскольку у вас ID_EQUIP integer, то IN использовать не имеет смысла, достаточно =

Я бы во внешней базе создал хранимую процедуру и вызывал бы ее с параметрами через execute statement.
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40019792
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем за предложенные тут варианты.

А с этим
Polesov

Я бы во внешней базе создал хранимую процедуру и вызывал бы ее с параметрами через execute statement.

нужно подумать, может быть не плохой вариант.

А вот еще такой момент:
Для отображения этого запроса, я использую компонент DBGridEh и серверную сортировку.
Я знаю чтоб работала сортировка, нужно предложение «order by» начинать с новой строки.

Составил такую комбинацию:
Код: sql
1.
2.
3.
4.
5.
    ADataSet.SelectSQL.Clear;
    ADataSet.SelectSQL.Add(L_SQL1);
    ADataSet.SelectSQL.Add('order by '+ AColumn.FieldName+' ');
    ADataSet.SelectSQL.Add(L_SQL2);
   ADataSet.Active := true;



В которой « L_SQL1 » часть представленного выше запроса до ' order by ', а « L_SQL2 » - часть запроса после ' order by '.
Сортировка происходит, точнее данные в столбце сортируются но по непонятному принципу . но не по полю NAME .
Конечно же пподключен модуль "EhLibIBX".
Запрос который в результате формируется такой комбинацией рабочий, я проверял его с помощью IBExpert - точнее сортирует правильно.

В чем может быть причина сего?
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40019849
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри через трассировку, что фактически улетает на сервер, и про эхалиб лучше спросить в соседнем разделе.
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40019878
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010а «L_SQL2» - часть запроса после 'order by '.
и что там после order by?
Kos-2010Запрос который в результате формируется такой комбинацией рабочий
так не бывает. Значит, запрос, который вы при отладке проверяете, и который уходит на сервер - не одно и то же.
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40019911
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010

Я знаю чтоб работала сортировка, нужно предложение «order by» начинать с новой строки.

Совершенно не обязательно. Какой компонент ADataSet используется?

Текст запроса можно посмотреть в отладчике. Надо на строке ADataSet.Active := true; поставить точку останова
И при попадании в нее в окне "Evalute/Modify" посмотреть значение ADataSet.SelectSQL.Text
Или в том же окне "Evalute/Modify" сохранить текст запроса, введя ADataSet.SelectSQL.SaveToFile( <FileName.Ext> )
...
Рейтинг: 0 / 0
Не получается вывести строки, которых нет в одной из таблиц
    #40020039
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot kdv#22234486]Kos-2010так не бывает. Значит, запрос, который вы при отладке проверяете, и который уходит на сервер - не одно и то же.
Да, я читал где-то на форуме, что после строк:
Код: sql
1.
2.
3.
  ADataSet.SelectSQL.Clear;
  ADataSet.SelectSQL.Add(L_SQL);
  ADataSet.Active := true;



он может немного переделываться.
там говорили о модуле "DBUtilsEh", и процедуре "ApplySortingForSQLBasedDataSet", что дебагером можно посмотреть почему неправильно формируется SQL после клика по заголовку столбца.
я процедуру нашел в
" c:\Program Files (x86)\Software developments\Delphi10_2\Embarcadero\Studio\19.0\Components\EhLib\Lib\DbUtilsEh.pas "
поставил точки останова, но при запуске они становятся не рабочими.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не получается вывести строки, которых нет в одной из таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]