Инструкция Interbase SQL не работает

#sql #delphi #delphi-7 #interbase

#sql #delphi #delphi-7 #interbase

Вопрос:

Я пытаюсь написать инструкцию SQL для Interbase.

Что не так с этим SQL?

md_master (trm) = Основная таблица cd_Med (cdt) = Подробная таблица

 SELECT trm.seq_no, trm.recipient_id, trm.payee_fullname, trm.payee_address1, trm.payee_address2, trm.payee_address3, trm.payee_address_city, trm.payee_address_state, trm.recip_zip, trm.recip_zip_4, trm.recip_zip_4_2, trm.check_no, trm.check_date, trm.check_amount,
cdt.com_ss_source_sys, cdt.cd_pay_date, cdt.com_set_amount,
bnk.name, bnk.address, bnk.transit_routing,
act.acct_no
FROM md_master trm, cd_med cdt, accounts act, banks bnk
join cd_med on cdt.master_id = trm.id
join accounts on act.acct_id = trm.account_tag
join banks on bnk.bank_id = act.bank_id
ORDER BY cdt.master_id
  

Я не получаю сообщение об ошибке, компьютер просто продолжает работать и зависает.

Ответ №1:

Я не знаю конкретно об Interbase, но это предложение FROM кажется немного странным (возможно, просто какой-то синтаксис, с которым я не знаком). Помогает ли это?

 ...
FROM md_master trm
join cd_med cdt on cdt.master_id = trm.id
join accounts act on act.acct_id = trm.account_tag
join banks bnk on bnk.bank_id = act.bank_id
  

Кстати, у вас нет предложения WHERE, поэтому, если какая-либо из этих таблиц большая, я не был бы слишком удивлен, что для ее выполнения требуется много времени.

Комментарии:

1. Я попробовал это на главной таблице с 50 записями. Я не получил точного подсчета подробных и дополнительных таблиц. Я попробую привести ваш пример

2. Это сделает это! Я вижу, что я сделал не так. Спасибо за помощь!

Ответ №2:

Вас укусил анти-шаблон, называемый implicit join syntax

 SELECT * FROM table_with_a_1000rows, othertable_with_a_1000rows
  

Выполнит перекрестное объединение для обеих таблиц, выбрав 1 миллион строк в выходных данных.

Вы делаете:

 FROM md_master trm, cd_med cdt, accounts act, banks bnk
  

Перекрестное соединение в 4 таблицах (в сочетании с последующими обычными соединениями), которое может легко генерировать многие миллиарды строк.
Неудивительно, что interbase зависает; он работает до конца времени, чтобы генерировать больше строк, чем атомов во вселенной.

Решение
Никогда не используйте , после предложения FROM , это неявное соединение, и это зло.
Используйте только явные соединения, например:

 SELECT 
  trm.seq_no, trm.recipient_id, trm.payee_fullname, trm.payee_address1
  , trm.payee_address2, trm.payee_address3, trm.payee_address_city
  , trm.payee_address_state, trm.recip_zip, trm.recip_zip_4, trm.recip_zip_4_2
  , trm.check_no, trm.check_date, trm.check_amount
  , cdt.com_ss_source_sys, cdt.cd_pay_date, cdt.com_set_amount
  , bnk.name, bnk.address, bnk.transit_routing
  , act.acct_no
FROM md_master trm
join cd_med on cdt.master_id = trm.id
join accounts on act.acct_id = trm.account_tag
join banks on bnk.bank_id = act.bank_id
ORDER BY cdt.master_id
  

Ответ №3:

Ошибка заключается в предложении from . Вы используете half с разделенными запятыми таблицами без отношения в предложении where и half с объединениями.

Просто используйте соединения, и все должно работать нормально

Комментарии:

1. не могли бы вы привести мне пример, пожалуйста

2. измените ИЗ md_master trm присоединиться к cd_med cdt на cdt.master_id = trm.id присоединиться к accounts act на act.acct_id = trm.account_tag присоединиться к банкам bnk на bnk.bank_id = act.bank_id должно работать