2016-04-14 3 views
1

4つのテーブル(軍、海軍、空軍、海兵隊員)がいる場合は、すべてプライマリキーとしてのシリアル番号と名前が付いています。私は主キーとop_nameとしてop_numを持つテーブル操作を持っています。私はまた、操作テーブルを他の4つのテーブルに関連付けるテーブル操作メンバを持っています。Microsoftを使用して秘密操作の「Desert Storm」のメンバーの名前を返す、単一のSQL文を書く方法SQL構文?SQL Serverのアソシエイティブテーブル

シリアル番号は、すべての4つのサービステーブル全体で一意でない場合、私はこの

SELECT Soldier.Name FROM Operation_Member 
INNER JOIN Operation 
    ON Operation.op_num = Operation_Member.op_num 
INNER JOIN 
(
    SELECT ser_num, name FROM Army 
    UNION ALL 
    SELECT ser_num, name FROM Navy 
    UNION ALL 
    SELECT ser_num, name FROM Air_Force 
    UNION ALL 
    SELECT ser_num, name FROM Marines 
) Soldier 
    ON Soldier.ser_num = Operation_Member.ser_num 
WHERE Operation.op_name = 'Desert Storm' 

しかし、この文句を言わない仕事を持っています。 その状態で動作することを確認する方法はありますか?

+0

のフォローアップ[この](http://stackoverflow.comをあいまいさを削除する方法はありません/ questions/36613802/associative-table-in-sql-server) – Arulkumar

答えて

1

4つのサービステーブルすべてでシリアル番号が一意でない場合は、Operation_Memberにもサービスブランチを保存しない限り、Operation_Memberで参照される重複を知る方法がありません。

そうした場合、あなたがない場合は、クエリは、この

SELECT Soldier.Name 
FROM 
    Operation 
    INNER JOIN 
    Operation_Member ON Operation.op_num = Operation_Member.op_num 
    INNER JOIN 
    (
     SELECT branchid, ser_num, name FROM Army 
     UNION ALL 
     SELECT branchid, ser_num, name FROM Navy 
     UNION ALL 
     SELECT branchid, ser_num, name FROM Air_Force 
     UNION ALL 
     SELECT branchid, ser_num, name FROM Marines 
    ) Soldier 
     ON Soldier.ser_num = Operation_Member.ser_num 
       AND Soldier.branchid= Operation_Member.branchid 
WHERE Operation.op_name = 'Desert Storm' 

なり、

+0

これは私が探していたものです。どうもありがとうございます – Addie