1

これはややこしいように聞こえますが、考え方は非常に単純です。

デフォルトのレートがある製品のリストを取得したいのですが、特定の「エージェント」にはレートがありません。そのためには、下の表から選択する必要があります

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

ID が 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  |

ただし、指定されたエージェント ID の t_Annual_AgentCost または t_Daily_AgentCost に存在することはできません

    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
4

2 に答える 2

1

一度に 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 )
     )

ここでの s は、 s とOR EXISTSほとんど同じように機能しUNION ALL SELECTます。

于 2013-04-06T18:37:25.337 に答える
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)
)

実際のテーブル名を入力できます。

于 2013-04-06T18:49:50.733 に答える