私はすでに数時間前からこの SQL パズルに頭を悩ませているので、「ねえ、スタックに聞いて、Web がソリューションから恩恵を受けられるようにしてみませんか?」と思いました。
だからここにあります。まず、これらは私の SQL テーブルです。
田畑
FieldID INT (PK)
FieldName NVARCHAR(50) (IX)
フォームフィールド
FieldID INT (FK)
FormID INT (FK)
値
FieldID INT (FK)
RecordID INT (FK)
Value NVARCHAR(1000)
フォーム
FormID INT (PK)
FormName NVARCHAR(50) (IX)
記録
RecordID INT (PK)
FormID INT (FK)
PoolID INT (FK)
データプール
PoolID INT (PK)
FormID INT (FK)
PoolName NVARCHAR(50) (IX)
次の制約を考慮してください。
- 各フォームには 0 個以上の DataPool があります。各 DataPool は 1 つの Form にのみ割り当てることができます。
- 各フォームには 0 個以上のフィールドがあります。各フィールドは複数のフォームに割り当てられる場合があります。
- 各レコードには 0 個以上の値があります。各値は、単一のレコードにリンクされています。
- 各 DataPool には 0 個以上のレコードがあります。各レコードは、単一の DataPool にリンクされています。
- 各値は 1 つのフィールドにリンクされています。
- また、すべての Name 列には一意の値があります。
さて、問題は次のとおりです。
次の列に基づいて、値テーブルからすべての値をクエリする必要があります。
- 値にリンクされたフィールドの名前
- 値にリンクされたレコードにリンクされたデータプールの名前
- その DataPool にリンクされたフォームの名前
上記の 3 つの列は、ストアド プロシージャで受け取った 3 つのパラメーターと等しくなければなりません。
これが私がこれまでに得たものです:
CREATE PROCEDURE [GetValues]
@FieldName NVARCHAR(50),
@FormName NVARCHAR(50),
@PoolName NVARCHAR(50)
AS SELECT Value FROM [Values]
JOIN [Fields]
ON [Fields].FieldID = [Values].FieldID
WHERE [Fields].FieldName = @FieldName
Values テーブルの行を PoolName 列でフィルタリングするにはどうすればよいですか? DataPools テーブルは Values テーブルに直接関連付けられていませんが、Values テーブルに直接関連付けられている Records テーブルには関連付けられています。それを行う方法についてのアイデアはありますか?