|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Доброе время суток уважаемые У меня есть 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.
Но новые записи, т.е. то оборудование у которого нет сертификатов к существующему результату не добавилось. Как бы мне модернизировать запрос? Заранее спасибо за ответ ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 00:53 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Скобки забыли Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:01 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Dimbuch® Скобки забыли Код: sql 1. 2.
да скобки помогли отчасти (записи в резльтате перестали множится) но всеравно в общий результат почему-то попадают лишние строки, т.е. в процедуре LAST_CERT , в запросе перестало выполняться условие. и в результате выбирает всю таблицу EQUIPMENT ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:13 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Kos-2010 в процедуре LAST_CERT , в запросе перестало выполняться условие. и в результате выбирает всю таблицу EQUIPMENT уточню уловие "..and lc.LAST_DATE is not null.." перестало работать ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:18 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Kos-2010, Надо в проверять на пустоту в таблице сертификатов поле, которое обязательно должно быть заполнено. Например, NUMBER_CERT Я так понял, что lc.DEVICE_ID_CL может быть пустым даже при наличии сертификата ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:20 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Dimbuch®, Тогда надо поставить условие по дате внутрь джоина Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:23 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Dimbuch®, поле "lc.DEVICE_ID_CL" (в таблице "CERTIFICATE ") это "ID" оборудования в таблице "EQUIPMENT" - и оно всегда заполнено. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:29 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Ну тогда так. Не знаю как еще склеить INNER и LEFT JOIN Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:35 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Dimbuch®, Спасибо, будем пробовать... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:36 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Dimbuch®, почему-то запрос Код: sql 1. 2. 3. 4. 5. 6. 7.
который должен по идее выбирать записи оборудования у которых нет сертификтов не хочет работать ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 01:49 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Вопрос: как правильно обработать результат процедуры LAST_CERT, которая ни чего не выдает? Потому что Код: sql 1.
не корректно работает, ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 22:54 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Всетаки решил переделать немного процедуру LAST_CERT , в самом скрипте, раньше я пробовал создать 2 запроса в процедуре, но у меня не получилось... т.е. первым скриптом я считаю строки которые подходят условию и если подходят (т.е. количество строк <> 0), то выбираю данные из CERTIFICATE - вторым скриптом но если результат первого скрипта = 0, я присваиваю Код: sql 1. 2. 3.
я создал внутреннюю отдельную процедуру и она работает. но когда я ее вставил в скрипт, выкидывает синтаксическую ошибку: 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.
Не подскажите где, тут ошибка? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 18:12 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
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.
Не подскажите где, тут ошибка? 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 19:05 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Polesov, Спасибо, большое. получилось... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 19:51 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Kos-2010 Polesov, Спасибо, большое. получилось... Запрос Код: sql 1.
вернет одну запись. Зачем использовать for execute statement? Запрос Код: sql 1.
может вернуть более одной записи, поэтому лучше использовать for execute statement, иначе будет ошибка " multiple rows in singleton select ". ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 22:04 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Polesov, кроме всего прочего, человек пытается еще и псевдо-ссылочную псевдо-целостность организовать. Оборудование в одной базе, а сертификаты в другой. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 23:36 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
kdv, ну, всех нюансов схемы хранения данных отсюда не видно. И вообще, вполне может быть, что автору топика базы "достались в наследство" ) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 00:04 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
kdv Оборудование в одной базе, а сертификаты в другой. Блобы оне зело тяжелые, места много надо, прогнать через б-р 500 гиг разом или 200+300, да на разных серверах задача заметно облегчается, времени требуется гораздо меньше. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 09:11 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Kos-2010, Polesov 22231055 если используется 3.0, то задействуем COUNT(*) OVER() и после чего брюки превращаются вместо двух EXECUTE STATEMENT ON EXTERNAL можно использовать один Далее с EXECUTE STATEMENT можно использовать параметры, вместо сборки запроса. Поскольку у вас ID_EQUIP integer, то IN использовать не имеет смысла, достаточно = ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 09:44 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Симонов Денис Kos-2010, Polesov 22231055 если используется 3.0, то задействуем COUNT(*) OVER() и после чего брюки превращаются вместо двух EXECUTE STATEMENT ON EXTERNAL можно использовать один Далее с EXECUTE STATEMENT можно использовать параметры, вместо сборки запроса. Поскольку у вас ID_EQUIP integer, то IN использовать не имеет смысла, достаточно = Я бы во внешней базе создал хранимую процедуру и вызывал бы ее с параметрами через execute statement. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2020, 11:26 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Спасибо всем за предложенные тут варианты. А с этим Polesov Я бы во внешней базе создал хранимую процедуру и вызывал бы ее с параметрами через execute statement. нужно подумать, может быть не плохой вариант. А вот еще такой момент: Для отображения этого запроса, я использую компонент DBGridEh и серверную сортировку. Я знаю чтоб работала сортировка, нужно предложение «order by» начинать с новой строки. Составил такую комбинацию: Код: sql 1. 2. 3. 4. 5.
В которой « L_SQL1 » часть представленного выше запроса до ' order by ', а « L_SQL2 » - часть запроса после ' order by '. Сортировка происходит, точнее данные в столбце сортируются но по непонятному принципу . но не по полю NAME . Конечно же пподключен модуль "EhLibIBX". Запрос который в результате формируется такой комбинацией рабочий, я проверял его с помощью IBExpert - точнее сортирует правильно. В чем может быть причина сего? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 07:33 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Посмотри через трассировку, что фактически улетает на сервер, и про эхалиб лучше спросить в соседнем разделе. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 11:16 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Kos-2010а «L_SQL2» - часть запроса после 'order by '. и что там после order by? Kos-2010Запрос который в результате формируется такой комбинацией рабочий так не бывает. Значит, запрос, который вы при отладке проверяете, и который уходит на сервер - не одно и то же. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 12:26 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
Kos-2010 Я знаю чтоб работала сортировка, нужно предложение «order by» начинать с новой строки. Совершенно не обязательно. Какой компонент ADataSet используется? Текст запроса можно посмотреть в отладчике. Надо на строке ADataSet.Active := true; поставить точку останова И при попадании в нее в окне "Evalute/Modify" посмотреть значение ADataSet.SelectSQL.Text Или в том же окне "Evalute/Modify" сохранить текст запроса, введя ADataSet.SelectSQL.SaveToFile( <FileName.Ext> ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 13:30 |
|
Не получается вывести строки, которых нет в одной из таблиц
|
|||
---|---|---|---|
#18+
[quot kdv#22234486]Kos-2010так не бывает. Значит, запрос, который вы при отладке проверяете, и который уходит на сервер - не одно и то же. Да, я читал где-то на форуме, что после строк: Код: sql 1. 2. 3.
он может немного переделываться. там говорили о модуле "DBUtilsEh", и процедуре "ApplySortingForSQLBasedDataSet", что дебагером можно посмотреть почему неправильно формируется SQL после клика по заголовку столбца. я процедуру нашел в " c:\Program Files (x86)\Software developments\Delphi10_2\Embarcadero\Studio\19.0\Components\EhLib\Lib\DbUtilsEh.pas " поставил точки останова, но при запуске они становятся не рабочими. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 17:00 |
|
|
start [/forum/topic.php?fid=40&msg=40016979&tid=1560188]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
170ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 264ms |
total: | 533ms |
0 / 0 |