2017-02-01 13 views
-1

私は、ProductsとSalespeopleのテーブルを含むデータベースを持っています。 各製品はセールス担当者によって販売されているので、Products.SalespersonIdSalespeople.Idの間にFK-PKリンク があります。珍しいことはありません。UNIONクエリを避ける

我々はそのための表では、「豚の耳」バックSalespeople.Id PKにFK'dでNULL可能ParentSalespersonId列 を持っているセールスマン、 に「属している」サブセールスマンを持つことができます。 、別に突合せ醜いことから

SELECT * 
    FROM Products 
INNER JOIN Salespeople ON Salespeople.Id = Products.SalespersonId 
WHERE Salespeople.Id = <some vale> -- products sold directly 

UNION 

SELECT * 
    FROM Products 
INNER JOIN Salespeople AS Sub ON Sub.Id = Products.SalespersonId 
INNER JOIN Salespeople AS Parent 
     ON Parent.Id = Sub.ParentSalespersonId 
WHERE Parent.Id = <some vale>-- products sold indirectly 

:選択された営業担当者によって販売されている

選択した製品も選択販売員のサブ営業担当者によって販売された製品を選択UNION必要 しかし自明でありますUNIONは、1つではなく2つのクエリを実行する必要があるため、パフォーマンスが低下します。

私はテーブルが必要な関係を達成ために再構成されるべきどのように長年にわたって多くのデータベースを作成し、書かれたクエリの100年代、 が、私はこの1つを測深することはできません...

ました、その醜いの必要性を削除するUNIONと第二のSELECT?あなただけの1クエリでそれを行うことができます

おかげ

+1

UNION'は避ける '回避する前に' SELECT * ' – Jodrell

+0

がちょうどsalesperson.idのための条件を追加したり、同じ希望値に –

答えて

1

は、あなたは、単に行うことはできません。

SELECT * 
FROM Products 
INNER JOIN Salespeople AS Sub ON Sub.Id = Products.SalespersonId 
LEFT JOIN Salespeople AS Parent 
     ON Parent.Id = Sub.ParentSalespersonId 
WHERE Parent.Id = <some vale> 
    OR Salespeople.Id = <some vale> 

Jodrellはコメントで述べたように、それは明示的にもお勧めです*ではなく、必要な列を選択します。

+0

ありがとう。それが役に立った – radders

1

SELECT * 
FROM Products as P 
    INNER JOIN Salespeople Sub ON Sub.Id = P.SalespersonId 
    LEFT OUTER JOIN Salespeople AS Parent ON Parent.Id = Sub.ParentSalespersonId 
WHERE 
    Sub.Id = <some vale> -- products sold directly 
    or Parent.Id = <some vale>-- products sold indirectly 
+0

感謝をparent.id、唯一の2番目のクエリを試してみてください。それは助けた – radders

0

えーと、

SELECT 
      * -- don't use SELECT * 
    FROM 
      [dbo].[Products] P 
     LEFT JOIN 
      [dbo].[Salespeople] I 
       ON I.[Id] = P.[SalespersonId] 
     LEFT JOIN 
      [dbo].[Salespeople] S 
       ON S.[Id] = P.[SalespersonId] 
     LEFT JOIN 
      [dbo].[Salespeople] P 
       ON P.[Id] = S.[ParentSalespersonId] 
    WHERE 
      I.[Id] IS NOT NULL 
     OR 
      P.[Id] IS NOT NULL; 
関連する問題