2016-04-14 3 views
1

Если у меня есть 4 стола (армия, военно-морской флот, военно-воздушные силы, морские пехотинцы), все они имеют серийный номер в качестве первичного ключа и имя. И у меня есть операция таблицы, которая имеет op_num в качестве первичного ключа и op_name. У меня также есть элемент операции таблицы, который связывает таблицу операций с другими четырьмя таблицами, как я могу написать один оператор SQL, вернуть имена членов (независимо от ветви службы) скрытой операции «Буря в пустыне» с помощью Microsoft Синтаксис SQL?Ассоциативная таблица в SQL Server

У меня есть этот

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

Если серийный номер не является уникальным для всех четырех таблиц служб, то нет способа узнать, какой из дубликатов указан в 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

Смежные вопросы