|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
10.11.2020, 00:59 | #1 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Не получается вывести строки, которых нет в одной из таблиц
Доброе время суток уважаемые
У меня есть 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». А без него выводятся вообще все оборудование Код:
Но новые записи, т.е. то оборудование у которого нет сертификатов к существующему результату не добавилось. Как бы мне модернизировать запрос? Заранее спасибо за ответ |
10.11.2020, 10:09 | #2 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
вар 1. перенести условие даты сертификата в join
Код:
Код:
НО не окажутся ли какие-либо записи базовой таблицы лишними ?.. вар 2. поставить скобки явно?.. Код:
программа — запись алгоритма на языке понятном транслятору
|
10.11.2020, 22:45 | #3 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Все предложеное вами попробовал... - не хочет правильно работать.
Но еще один вариант есть Код:
а второй - выбирает устройства у которого вообще нет сертификатов, нет строк в таблице CERTIFICATE. И что оказалось: если их запускать по отдельности, то - первый select - работает на ура; - второй select - ни фига НЕ работает, точнее работает но не выбирает то что нужно, т.е. не правильно обрабатывает результат процедуры LAST_CERT, когда ничего не выдает, т.е. ПУСТОЙ результат Последний раз редактировалось KBO; 10.11.2020 в 23:13. |
11.11.2020, 14:04 | #4 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
вар. 3.
Код:
выдает и записи c отсутствующими сeртификатами. (и last_date у них =null )
программа — запись алгоритма на языке понятном транслятору
|
12.11.2020, 18:01 | #5 |
Форумчанин
Регистрация: 11.06.2010
Сообщений: 525
|
Всетаки решил переделать немного процедуру LAST_CERT, в самом скрипте, раньше я пробовал создать 2 запроса в процедуре, но у меня не получилось...
т.е. первым скриптом я считаю строки которые подходят условию и если подходят (т.е. количество строк <> 0), то выбираю данные из CERTIFICATE - вторым скриптом но если результат первого скрипта = 0, я присваиваю Код:
но когда я ее вставил в скрипт, выкидывает синтаксическую ошибку: 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. сам скрипт: Код:
Последний раз редактировалось KBO; 12.11.2020 в 18:08. |
13.11.2020, 12:16 | #6 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
0. C FireBird не работал.
1. Цитата:
2. Цитата:
программа — запись алгоритма на языке понятном транслятору
|
||
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как в одной форме вывести данные из двух таблиц по связующему полю. | Znaharkms | Microsoft Office Access | 8 | 17.05.2018 00:06 |
Дан двумерный массив.Вывести строки,в которых нет нулевых элементов | sasha1212 | Общие вопросы C/C++ | 7 | 01.06.2014 22:10 |
Как в report.rdlc в таблице вывести значения не одной таблицы,а нескольких таблиц | Babur4iK | C# (си шарп) | 0 | 30.03.2014 20:31 |
Дана последовательность символов, состоящая из слов. Вывести на экран слова, в которых все символы повторяющиеся (строки на C) | Роман64 | Помощь студентам | 0 | 22.12.2013 15:00 |
Паскаль(файлы). Дан текстовый файл f. Вывести все строки файла длина которых больше 30 символов. | Артемdgty | Помощь студентам | 0 | 09.10.2013 00:37 |