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 フィールドを持つテーブルが 3 つあります。1 つのテーブルにはそれが主キーとしてあり、他の 2 つのテーブルには外部キーがあります。クエリの実際の唯一の違いは、「ON」と「USING」です。

4

1 に答える 1

0

最初の参加の後、ENCOUNTERS からの 1 つの INST_ID があります。2 番目の参加の後、CLIENTS_MRNS からの追加の参加があります。この重複により、3 番目の結合は失敗します。

于 2013-06-20T20:53:53.540 に答える