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 句の既知の制限ですか?