第一の質問:
SELECT
distinct t.TaskID
FROM
Floor f
inner join
Area a
on
f.FloorID = a.FloorID
left join
Asset ast
on
a.AreaID = ast.AreaID
inner join
Task t
on
t.AreaID = a.AreaID or
t.AssetID = ast.AssetID
WHERE
f.FloorID = @FloorID
は、あなたが構築しようとしているクエリの形状を与える必要があります。 (もちろん、あなたが実際にあなたがすでにFloorIDを持っている場合、フロアテーブルを照会する必要はありません)
第二の質問:
CREATE TABLE Task (
TaskID int not null,
AreaID int null,
AssetID int null,
constraint PK_Task PRIMARY KEY (TaskID),
constraint FK_Task_Area FOREIGN KEY (AreaID) references Area (AreaID),
constraint FK_Task_Asset FOREIGN KEY (AssetID) references Asset (AssetID),
constraint CK_Task_OneNonNull CHECK (
(AreaID is null and AssetID is not null) or
(AssetID is null and AreaID is not null))
)
あるいは、あなたはユニークなを追加し、エリアIDがnullでないことができます(AreaID、AssetID)のAssetテーブルの制約を確認し、Assetテーブルへの外部キーを両方のカラムで参照するようにします。これにより、AssetIDが指定されている場合、正しいAreaIDに属するAssetにリンクされます。
これがすべて使用されようとしている方法を知らずに言うのは難しい:エリアIDは、タスク
第三の質問に常にあります場合、これはまた、Q1への答えを簡素化します。私はそれがのun-合理的なアプローチだとは思わない。
「エリア」を特定の種類の資産としてモデル化することを検討しましたか? 「エリア」と「アセット」は全く違っていますか(あなたがやっている仕事を含む)ですか?それとも、同じように違いますか? –