0

DDLが次の3つのテーブルを含む正規化されたデータベースがあります。

CREATE CACHED TABLE Clients ( 
    cli_id       INTEGER       GENERATED ALWAYS AS IDENTITY (START WITH 100) PRIMARY KEY,
    defmrn_id    BIGINT,
    lastName     VARCHAR(48)   DEFAULT '' NOT NULL,
    midName      VARCHAR(24)   DEFAULT '' NOT NULL,
    firstName    VARCHAR(24)   DEFAULT '' NOT NULL,
    doB          INTEGER       DEFAULT 0 NOT NULL,
    gender       VARCHAR(1)    NOT NULL);

CREATE TABLE Client_MRNs (
    mrn_id       BIGINT        GENERATED ALWAYS AS IDENTITY (START WITH 100) PRIMARY KEY,
    cli_id       INTEGER       REFERENCES Clients ( cli_id ),
    inst_id      INTEGER       REFERENCES Institutions ( inst_id ),
    mrn          VARCHAR(32)   DEFAULT '' NOT NULL,

    CONSTRAINT climrn01 UNIQUE (mrn, inst_id));

CREATE TABLE Institutions ( 
    inst_id      INTEGER       GENERATED ALWAYS AS IDENTITY (START WITH 100) PRIMARY KEY,
    loc_id       INTEGER       REFERENCES Locales (loc_id ),
    itag         VARCHAR(6)    UNIQUE NOT NULL,
    iname        VARCHAR(80)   DEFAULT '' NOT NULL);

最初のテーブルには、外部キー列 defmrn_id が含まれています。これは、2 番目のテーブル (すべての識別子コードのリスト) に格納されている「既定の識別子コード」への参照です。最初のテーブルのレコードには多くの識別子が含まれる場合がありますが、デフォルトの識別子は 1 つだけです。そうそう、私は循環参照を作成しました。

3 番目のテーブルは、2 番目のテーブルの正規化されたデータです。

提供された識別子コードを、その CLIENT レコードに属する可能性のある CLIENT_MRN 内の識別子コードのいずれかに一致させることに基づいて、CLIENT レコードを見つけるクエリが必要でした。

私の戦略は、最初に 2 番目のテーブル (CLIENT_MRN) に一致するレコードを特定し、その中間結果を使用して、他のユーザー指定の検索条件に一致する CLIENT テーブルのレコードに結合することでした。また、最初のテーブルの識別子参照 defmrn_id を非正規化する必要があります。これが私が思いついたものです...

SQL = SELECT c.*, r.mrn, i.inst_id, i.itag, i.iname 
FROM Clients AS c 
INNER JOIN 
  (   
      SELECT m.cli_id   
      FROM Client_MRNs AS m   
      WHERE m.mrn = ? 
  ) AS m2 ON m2.cli_id = c.cli_id 
INNER JOIN Client_MRNs AS r ON c.defmrn_id = r.mrn_id 
INNER JOIN Institutions AS i USING ( inst_id )  
WHERE (<other user supplied search criteria...>);

上記は機能しますが、以下が機能しない理由を理解しようと時間を費やしました...

SQL = SELECT c.*, r.mrn, i.inst_id, i.itag, i.iname 
FROM Clients AS c 
INNER JOIN 
  (   
      SELECT m.cli_id   
      FROM Client_MRNs AS m   
      WHERE m.mrn = ? 
  ) AS m2  USING ( cli_id ) 
INNER JOIN Client_MRNs AS r ON c.defmrn_id = r.mrn_id 
INNER JOIN Institutions AS i USING ( inst_id )  
WHERE (<other user supplied search criteria...>);

2 番目の SQL は機能するはずですが、毎回 USING 句で失敗します。RDBMS として HSQLDB 2.2.9 で管理されているデータベースに対してこれらのクエリを実行しています。これは HSQLDB の解析の問題ですか、それともネストされたクエリでの USING 句の既知の制限ですか?

4

1 に答える 1