ここにスーパータイプ/サブタイプの状況があるようです。この場合、Table1はスーパータイプを保持し、各サブタイプを保持するために異なるテーブルを作成する必要があります。これらのサブタイプテーブルのPKは、スーパータイプテーブルのFKにもなります。したがって、次のようなものになります。
Supertype_table
| ID(PK) | A | B |
Subtype1_table
| ID(PK&FK) | C | D | E |
Subtype2_table
| ID(PK&FK) | F | G | H | I |
Subtype3_table
| ID(PK&FK) | J |
このスキーマのポイントは、ほとんどがnullである行の束がないことを確認することです。メソッドごとに、適切なテーブルを挿入/更新する個別のクエリを作成する必要があります。SQL Serverを使用すると、これらすべてのテーブルを組み合わせて、結合を抽象化するビューを作成できます。
CREATE VIEW MyView
SELECT Super.ID, Super.A, Super.B,
Sub1.C, Sub1.D, Sub1.E,
Sub2.F, Sub2.G, Sub2.H, Sub2.I,
Sub3.J
FROM Supertype_table as Super
LEFT OUTER JOIN Subtype1_table as Sub1 on Super.ID = Sub1.ID
LEFT OUTER JOIN Subtype2_table as Sub2 on Super.ID = Sub2.ID
LEFT OUTER JOIN Subtype3_table as Sub3 on Super.ID = Sub3.ID
したがって、次のように書くことができます。
SELECT ID, A, B, J
FROM MyView
WHERE J is not null
編集:OPのコメントのために
各IDが1つだけのテーブルにあることを確認するには、スーパータイプテーブルにある種の識別子が必要です。したがって、TypeIDという列がある場合は、次の関数を作成します。
CREATE FUNCTION [dbo].[SubtypeofSuperID](@ID int)
RETURNS int
AS
BEGIN
DECLARE @TypeID int;
SELECT @TypeID = TypeID
FROM Supertype_table
WHERE ID = @ID
RETURN @TypeID
END
次に、それを使用して、各サブタイプテーブルにチェックを作成できます。
ALTER TABLE Subtype1_table CONSTRAINT [CK_CorrectSubtype1]
CHECK ( [dbo].[SubtypeofSuperID]([ID]) = 1 )
ALTER TABLE Subtype2_table CONSTRAINT [CK_CorrectSubtype2]
CHECK ( [dbo].[SubtypeofSuperID]([ID]) = 2 )
ALTER TABLE Subtype3_table CONSTRAINT [CK_CorrectSubtype3]
CHECK ( [dbo].[SubtypeofSuperID]([ID]) = 3 )