【问题标题】:HSQLDB v.2.3.0: USING predicate working as intended?HSQLDB v.2.3.0:使用谓词按预期工作?
【发布时间】:2013-06-20 02:15:03
【问题描述】:

对 HSQLDB 2.3.0 的快照 50 执行以下查询时会产生错误。错误消息是“错误:派生表中的列名重复:INST_ID”

SELECT c.lastname, to_date_string(c.dob), i.itag|| ': ' || 
       m.mrn, to_date_string(en.dofs), 
       to_date_string(en.dols), pa.payertag, 
       y.dxname, d.icd9, d.icd10, d.icd10name, 
       to_datetime_string(s.dos), r.cpt, r.rxname, p.lastname || ', ' || 
       p.firstname

FROM   Encounters AS en
       INNER JOIN Clients AS c USING ( cli_id )
       INNER JOIN Client_MRNs AS m ON c.defmrn_id = m.mrn_id
       INNER JOIN Institutions AS i USING ( inst_id )
       INNER JOIN Payers AS pa USING ( payer_id )

       INNER JOIN Encounter_DXs AS x USING ( enc_id )
       INNER JOIN Diagnoses AS d USING ( dx_id )
       INNER JOIN DXSynonyms AS y ON d.defsyn_id = y.syn_id

       INNER JOIN Services AS s USING ( enc_id )
       INNER JOIN RXCodes AS r USING ( rx_id )
       INNER JOIN Providers AS p USING ( prov_id )

WHERE  (s.dos >= 56453 AND s.dos < 56461)
ORDER BY c.lastname, en.dofs, s.dos; 

但是,当我执行相同的查询但将所有 USING 谓词替换为 ON ... = 短语时,它会成功执行:

SELECT c.lastname, to_date_string(c.dob), i.itag|| ': ' || 
       m.mrn, to_date_string(en.dofs), 
       to_date_string(en.dols), pa.payertag, 
       y.dxname, d.icd9, d.icd10, d.icd10name, 
       to_datetime_string(s.dos), r.cpt, r.rxname, p.lastname || ', ' || 
       p.firstname

FROM   Encounters AS en
       INNER JOIN Clients AS c ON c.cli_id = en.cli_id 
       INNER JOIN Client_MRNs AS m ON c.defmrn_id = m.mrn_id
       INNER JOIN Institutions AS i ON i.inst_id = m.inst_id
       INNER JOIN Payers AS pa ON pa.payer_id = en.payer_id

       INNER JOIN Encounter_DXs AS x ON x.enc_id = en.enc_id
       INNER JOIN Diagnoses AS d ON d.dx_id = x.dx_id
       INNER JOIN DXSynonyms AS y ON d.defsyn_id = y.syn_id

       INNER JOIN Services AS s ON s.enc_id = en.enc_id
       INNER JOIN RXCodes AS r ON r.rx_id = s.rx_id
       INNER JOIN Providers AS p ON p.prov_id = s.prov_id

WHERE  (s.dos >= 56453 AND s.dos < 56461)
ORDER BY c.lastname, en.dofs, s.dos; 

这是否按预期工作?我喜欢使用 USING,因为它可以减少冗长、简洁的代码。我现在不包括表的 DDL(但可以),因为查询很大并且涉及许多表,但是有三个表具有 INST_ID 字段。一个表将其作为主键,另外两个表具有外键。实际上,查询的唯一区别是“ON”与“USING”。

【问题讨论】:

  • 请列出具有 INST_ID 的表名。
  • @fredt:当然可以。此查询中具有 INST_ID 引用或键的三个表是 INSTITUTIONS、CLIENT_MRNS 和 ENCOUNTERS。这些表具有涉及 INST_ID 的约束。 INSTITUTIONS 将其作为主键。 CLIENT_MRNS 有一个外键和一个涉及 (INST_ID) 的复合唯一约束。 ENCOUNTERS 也有一个外键约束。

标签: sql hsqldb


【解决方案1】:

第一次加入后,有一个来自 ENCOUNTERS 的 INST_ID。在第二次加入之后,还有一个来自 CLIENTS_MRNS 的附加。由于这种重复,第三次连接失败。

【讨论】:

  • 那么,按预期工作吧。我曾想象过 inst_id 仍然可以通过它们的完全限定名称来区分,因此不会重复。如果有问题,我认为这将是因为 USING ( inst_id ) 导致的 inst_id 缺少限定名称。
  • 啊 ...所以 DBMS 无法确定在我使用的 INNER JOIN 机构 ( inst_id ) 中与 i.inst_id 一起使用哪个 inst_id。此时,数据集将同时包含 m.inst_id 和 en.inst_id。
猜你喜欢
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多