Инструкция Interbase SQL не работает - PullRequest
0 голосов
/ 04 октября 2011

Я пытаюсь написать оператор 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

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

Ответы [ 3 ]

7 голосов
/ 04 октября 2011

Я не знаю конкретно о 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 голос
/ 04 октября 2011

Вы были укушены анти-шаблоном под названием 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
0 голосов
/ 04 октября 2011

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

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

...