0

对 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”。

4

1 回答 1

0

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

于 2013-06-20T20:53:53.540 回答