Interbase SQL语句不起作用

时间:2011-10-04 13:19:47

标签: sql delphi delphi-7 interbase

我正在尝试为Interbase编写一个SQL语句。

这个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 个答案:

答案 0 :(得分:7)

我不是特别了解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 :(得分:1)

您被一种名为implicit join syntax

的反模式所困扰
SELECT * FROM table_with_a_1000rows, othertable_with_a_1000rows

将在两个表上进行交叉连接,在输出中选择100万行。

你在做:

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

答案 2 :(得分:0)

错误在于from子句。你使用逗号分隔表的一半,在where子句中没有关系,一半用连接。

只需使用联接,一切都应该正常