2013-04-06 2 views
1

Это звучит запутанно, но идея довольно проста.Как я могу выбрать из одной таблицы, где идентификатор существует в одной из двух таблиц, но не в любой из двух других таблиц.

Я хочу получить список продуктов, которые имеют ставки по умолчанию, но у данного «Агента» нет ставок. Чтобы сделать это, нужно выбрать из приведенных ниже таблиц

t_Products 
|-ProductID-|--Product-| 
| 100  | Product1 | 
| 101  | Product2 | 
| 102  | product3 | 
| 103  | product4 | 

Если идентификатор существует в любом t_Annual_DefaultCost или t_Daily_DefaultCost

t_Annual_DefaultCost 
|-DefaultID-|-ProductID-|--Cost-| 
| 100 |  100 | 24.00 | 
| 101 |  101 | 26.00 | 

    t_Daily_DefaultCost 
|-DefaultID-|-ProductID-|--Cost-|-Days-| 
| 100 |  100 | 24.00 | 1 | 
| 101 |  100 | 26.00 | 2 | 
| 102 |  102 | 22.50 | 2 | 
| 103 |  102 | 97.50 | 8 | 

Но оно не может существовать в любом t_Annual_AgentCost или t_Daily_AgentCost для данного агента ID

t_Annual_AgentCost 
|---CostID--|-ProductID-|-AgentID-|--Cost-| 
| 100 | 100 | 10001 | 24.00 | 
| 101 | 100 | 10001 | 20.00 | 

    t_Daily_AgentCost 
|---CostID--|-ProductID-|-AgentID-|--Cost-|-Days-| 
| 100 |  100 | 10001 | 24.00 | 1 | 
| 102 |  102 | 10002 | 35.00 | 2 | 

так для AgentID 10001 конечный результат должен быть

|-ProductID-|--Product-| 
| 101  | product2 | 
| 102  | product3 | 

и AgentID 10002 конечный результат должен быть

|-ProductID-|--Product-| 
| 100  | product1 | 
| 101  | product2 | 

настоящее время я использую следующий код, чтобы получить список продуктов, которые имеют ставки по умолчанию. Но я не могу решить, как удалить/не получить их также в таблицах AgentCost.

Select 
    distinct a.* 
from 
    t_Products as a 
inner join 
    ( 
     select 
      DefaultID ,ProductID 
     from 
      t_Daily_DefalutCost 

     union 

     select 
      DefaultID , ProductID 
     from 
      t_Annual_DefaultCost 
    ) 
    as b on a.ProductID = b.ProductID 
+0

Когда вы укажете ID, укажите, какой идентификатор. И в выражении In: «Но он не может существовать ни в t_Annual_AgentCost, ни в t_Daily_AgentCost для данного идентификатора агента», вы хотите сказать «Но он не может существовать в NEITHER t_Annual_AgentCost NOR t_Daily_AgentCost для данного идентификатора агента»? –

+1

Зачем нужно ProductID 103 для AgentID 10002, но не для AgentID 10001? – GilM

+0

@ galuano1 Где я не сказал, какой ID? и да, я имею в виду последний. Сейчас я отредактирую его. –

ответ

1

Если вы хотите сделать один агент в то время, то это, как я хотел бы сделать это:

SELECT 
    a.* 
FROM 
    t_Products As a 
WHERE 
    ( EXISTS(SELECT * FROM t_Daily_DefaultCost As d WHERE d.ProductID = a.ProductID) 
    OR EXISTS(SELECT * FROM t_Annual_DefaultCost As d WHERE d.ProductID = a.ProductID) 
    ) 
AND NOT 
    ( EXISTS(SELECT * FROM t_Daily_AgentCost As d 
       WHERE d.ProductID = a.ProductID 
       AND d.AgentID = @SpecifedAgentID) 
    OR EXISTS(SELECT * FROM t_Annual_AgentCost As d 
       WHERE d.ProductID = a.ProductID 
       AND d.AgentID = @SpecifedAgentID) 
    ) 

В OR EXISTS s здесь работают почти так же, как UNION ALL SELECT s будет.

+0

Приветствует это работает блестяще. –

0

Я бы использовал такой подход.

select yourfields 
from yourtables 
where id in 
(

(select id 
from onetable 
union 
select id 
from anothertable) 
except 
(select id 
    from yetanothertable 
    union 
    select id 
    from thefinaltable) 
) 

Вы можете заполнить фактические имена таблиц.

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