简体   繁体   English

Interbase SQL语句不起作用

[英]Interbase SQL statement not working

I am trying to write a SQL Statement for Interbase. 我正在尝试为Interbase编写一条SQL语句。

Whats wrong with this SQL? 此SQL有什么问题?

md_master (trm) = Master Table cd_Med (cdt) = Detail table 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

I don't get an error, the computer just keeps crunching away and hangs. 我没有收到错误,计算机只是不断崩溃而挂起。

I don't know about Interbase specifically, but that FROM clause seems a little strange (perhaps just some syntax I'm not familiar with though). 我不特别了解Interbase,但是FROM子句似乎有点奇怪(也许只是一些我不熟悉的语法)。 Does this help? 这有帮助吗?

...
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

By the way, you have no WHERE clause so if any of these tables is large, I wouldn't be overly surprised that it takes a long time to run. 顺便说一句,您没有WHERE子句,因此,如果这些表中的任何一个很大,则运行时间很长,我不会感到惊讶。

You have been bitten by an anti-pattern called implicit join syntax 您被称为implicit join syntax的反模式所implicit join syntax

SELECT * FROM table_with_a_1000rows, othertable_with_a_1000rows

Will do a cross-join on both tables selecting 1 million rows in the output. 将在两个表上进行交叉联接,并在输出中选择100万行。

You are doing: 您正在执行:

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

A cross join on 4 tables (combined with normal joins afterwards) , which could easily generate many billions of rows. 在4个表上进行交叉联接(此后再与常规联接组合) ,可以轻松生成数十亿行。
No wonder interbase hangs; 怪不得基层间挂起; it is working until the end of time to generate more rows then there are atoms in the universe. 它一直工作到时间结束,才能生成更多的行,然后宇宙中才存在原子。

The solution 解决方案
Never use , after the FROM clause, that is an implicit join and it is evil. 永远不要在FROM子句之后使用,这是一个隐式连接,这是邪恶的。
Only use explicit joins, like so: 仅使用显式联接,如下所示:

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

The error lie in the from clause. 错误在于from子句。 You are using half with comma separated tables without a relation in where clause and half with joins. 您使用的是一半用逗号分隔的表,而where子句中没有关系,一半使用联接。

Just use joins and all should work fine 只需使用联接,一切都应该正常工作

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM