2016-07-01 10 views
0

Table ATable Bを参照しています。 Table Bは、Aの各レコードに1つ以上のエントリを持つことがあります.Bでは、ステータスとして列があります。条件を指定して1行を選択します。ステータスがOAまたはOB以外である場合、 ケースステートメントに基づいて複数のテーブルを結合する際に1行を選択する方法

いずれかの行を選択
  • その行を選択し、ステータスが任意の行におけるOAまたはOBの場合、私はTable B

    • 3つのエントリが検討

      マイクエリ

  • --lot more table joins already here 
    LEFT JOIN(
    SELECT CASE WHEN EXISTS 
         (SELECT 1 FROM A a1 INNER JOIN B b1 ON a1.id = b1.id  
         WHERE b1.status in ('OA','OB')) 
         THEN (SELECT b1.rcid FROM A a1 INNER JOIN B b1 ON a1.id = b1.id  
         WHERE b1.status in ('OA','OB')) 
         ELSE 
         SELECT TOP 1 b2.rcid FROM A a2 INNER JOIN B b2 ON a2.id = b2.id 
         END 
        ))Z on z.id=b2.id --again join with table for b2.rcid 
    

    は、これは正しい方法ですか?パフォーマンスに影響はありますか?実際にここで強調したいのは、実際には10個のテーブルに参加する必要があり、そのうちの5個には100,000以上のレコードが含まれます。

    答えて

    0
    cross/outer apply (
        select top 1 status 
        from B b 
        where b.id = a.id 
        order by case when status in ('OA', 'OB') then 1 else 2 end, status 
    ) 
    

    または

    inner/left join (
        select 
         id, 
         case min(case when status in ('OA', 'OB') then 1 else 2 end) 
          when 1 then min(cast when status in ('OA', 'OB') then status end) 
          when 2 then min(status) 
         end 
        from B 
        group by id 
    ) b on b.id = a.id 
    
    +0

    最初のソリューションは、私を助けます。しかし、別の問題は、前に私のテーブルAには、 "適用"前に結合されたテーブルの行が含まれていない可能性がありますので、このクロス適用はそれらをスキップしますが、テーブルAのレコードも必要です。 – Satheesh

    +0

    @Sheheesh「外側適用」を使用します。 – shawnt00

    +0

    はい、私はそれとその作業を試みましたが、それは外部適用を使用することをお勧めします。リンクhttp://stackoverflow.com/questions/6726696/cross-apply-vs-outer-apply-speed-differenceに従って。少なくとも10Kを引き出すlacレコード以上のテーブルを照会しているので、Outerの適用はパフォーマンスに影響します。 – Satheesh

    関連する問題