【问题标题】:Interbase SQL statement not workingInterbase SQL 语句不起作用
【发布时间】:2011-10-04 13:19:47
【问题描述】:

我正在尝试为 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

我没有收到错误,计算机只是不停地运转并挂起。

【问题讨论】:

    标签: sql delphi delphi-7 interbase


    【解决方案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 子句,所以如果这些表中的任何一个很大,我不会对它需要很长时间来运行感到过分惊讶。

    【讨论】:

    • 我在一个有 50 条记录的主表上试了一下。我没有得到详细信息和附加表的准确计数。我会试试你的例子
    • 这样就行了!我明白我做错了什么。感谢您的帮助!
    【解决方案2】:

    你被一个名为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
    

    【讨论】:

      【解决方案3】:

      错误在于 from 子句。您在 where 子句中使用一半带有逗号分隔的表,而一半带有连接。

      只需使用连接,一切都应该可以正常工作

      【讨论】:

      • 你能举个例子吗
      • 更改 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 bank bnk on bnk.bank_id = act.bank_id 应该可以工作跨度>
      猜你喜欢
      • 1970-01-01
      • 2021-02-28
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多