2012-02-23 27 views
1

iはテーブルを持っている上にテーブルの結合:はAまたはBまたはC

docname, specialtycode1, specialtycode2, specialtycode3 

iは別のテーブル

specialtycode1, specialtycode1desc 
specialtycode2, specialtrycode2desc 
specialtycode3, specialtycode3desc 

を有する私が望む結果は:

docname, specialtycode1, secialtycode1desc, 
    specialtycode2, specialtycode2desc, 
    specialtycode3, specialtycode3desc 

私が試し次のようなクエリを実行する:

join dbo.SpecialtyMapping as f on (e.specialtycode1=f.specialtyabbrev 
           or e.specialtycode2=f.specialtyabbrev 
           or e.specialtycode3=f.specialtyabbrev) 

私はこれが正しい解決策だとは思っていませんが、どこから始めるべきかはわかりません。助けてください!あなたが最初のテーブルの列と3「専門・コード」を持っている場合、あなたはどちらか3が結合、またはあなたのDOCNAMEテーブルからデータをアンピボットし、できなければなりません

WITH cte(rejected) AS (SELECT DISTINCT [Specimen ID] 
               FROM   dbo.QuickLabDump 
               WHERE  (Outcome = 'REJECTED') AND ([Specimen ID] IS NOT NULL)) 
    SELECT  CONVERT(VARCHAR(8), a.[Date Entered], 1) AS [Full Date], DATEPART(yy, a.[Date Entered]) AS [Year Entered], LEFT(DATENAME(MONTH, a.[Date Entered]), 3) 
          AS [Month Entered], DATEPART(dd, a.[Date Entered]) AS [Day Entered], CASE WHEN DATEPART(WEEKDAY, [DATE entered]) 
          = 1 THEN 'Sun' WHEN DATEPART(WEEKDAY, [DATE entered]) = 2 THEN 'Mon' WHEN DATEPART(WEEKDAY, [DATE entered]) 
          = 3 THEN 'Tus' WHEN DATEPART(WEEKDAY, [DATE entered]) = 4 THEN 'Wed' WHEN DATEPART(WEEKDAY, [DATE entered]) 
          = 5 THEN 'Thu' WHEN DATEPART(WEEKDAY, [DATE entered]) = 6 THEN 'Fri' WHEN DATEPART(WEEKDAY, [DATE entered]) = 7 THEN 'Sat' END AS DOW, 
          CONVERT(VARCHAR(8), DATEADD(D, - (1 * DATEPART(dw, a.[Date Entered])) + 6, a.[Date Entered]), 1) AS [Week Ending], COUNT(DISTINCT a.[Specimen ID]) 
          AS CountAccns, c.SALESREP AS [Sales Rep], c.NPI AS MLNPI, e.NPIb AS IMSNPI, e.SpecialtyPrimaryCodeb AS [IMS Specialty Primary Code], 
          f.specialtydesc, 
          e.SpecialtySecondaryCodeb AS [IMS Specialty Secondary Code], e.SpecialtyTertiaryCodeb AS [IMS Specialty Tertiary Code], 
          e.ProfessionalID1b AS [IMS Professional ID 1], a.[Requesting Physician] AS Physician, a.[Practice Code], b.[MLIS Practice ID] AS [MLIS Code], a.[Practice Name], 
          c.DATEESTABLISHED AS [Date Established], c.PRACTICEADDRESS1 AS Address, c.PRACTICEADDRESS2 AS Address2, c.PRACTICECITY AS City, 
          c.PRACTICESTATE AS State, d.[MLIS Status] AS Status, MAX(a.[Order Count]) AS [order count] 
    FROM   dbo.QuickLabDump AS a LEFT OUTER JOIN 
          dbo.qlmlismapping AS b ON b.[Quicklab ID] = a.[Practice Code] LEFT OUTER JOIN 
          dbo.PracticeandPhysician AS c ON a.[Requesting Physician] = c.DOCTORFIRSTNAME + ' ' + c.DOCTORLASTNAME AND 
          a.[Practice Code] = c.PRACTICECODE LEFT OUTER JOIN 
          dbo.IMSData AS e ON c.NPI = e.NPIb LEFT OUTER JOIN 
          dbo.QLMLISInfo AS d ON b.[MLIS Practice ID] = d.[MLIS Practice ID] 
          join dbo.SpecialtyMapping as f on (e.specialtyprimarycodeb=f.specialtyabbrev 
           or e.specialtysecondarycodeb=f.specialtyabbrev 
           or e.specialtytertiarycodeb=f.specialtyabbrev) 
    WHERE  (a.[Date Entered] > '20110101') AND (NOT EXISTS 
           (SELECT  1 AS Expr1 
            FROM   cte AS cte_1 
            WHERE  (rejected = a.[Specimen ID]))) AND (NOT EXISTS 
           (SELECT  1 AS Expr1 
            FROM   dbo.PendingSpecimens 
            WHERE  ([Specimen ID] = a.[Specimen ID]))) 
    GROUP BY a.[Date Entered], c.SALESREP, c.NPI, e.NPIb, e.SpecialtyPrimaryCodeb, e.SpecialtySecondaryCodeb, e.SpecialtyTertiaryCodeb, e.ProfessionalID1b, 
          a.[Requesting Physician], a.[Practice Code], b.[MLIS Practice ID], a.[Practice Name], c.DATEESTABLISHED, c.PRACTICEADDRESS1, c.PRACTICEADDRESS2, 
          c.PRACTICECITY, c.PRACTICESTATE, d.[MLIS Status],f.specialtydesc 
+0

エラーが発生しましたか?そして、完全なクエリは何ですか(あなたはSELECT、FROMまたは他のテーブルを投稿していません) –

+0

@SirCrispalotエラーはありませんが、20分のようになりましたが、まだ結果はありません –

+0

テーブルの名前とフルお問い合わせください? –

答えて

1

:ここ

がいっぱいクエリです単一のJOINを実行します。私はあなたの元のクエリのあまり変更を必要としないであろう溶液で実行されます:
SELECT 
    ims.docname 
    ,ims.specialtycode1, sm1.specialtycode1desc 
    ,ims.specialtycode2, sm2.specialtycode2desc 
    ,ims.specialtycode3, sm3.specialtycode3desc 
FROM 
    dbo.IMSData ims 
LEFT JOIN 
    dbo.SpecialtyMapping sm1 ON ims.specialtycode1 = sm1.specialtyabbrev 
LEFT JOIN 
    dbo.SpecialtyMapping sm2 ON ims.specialtycode2 = sm2.specialtyabbrev 
LEFT JOIN 
    dbo.SpecialtyMapping sm3 ON ims.specialtycode3 = sm3.specialtyabbrev 

は限り、あなたの SpecialtyMapping表の行が一意であるように、これは動作するはずです。

EDIT - コメント内の提案に従ってLEFT JOINに更新されました。私はまた、列の名前はあなたのクエリで持っているものとまったく同じではないことに気付きましたが、あなたは要点を得るでしょう。

+0

ありがとう!これは物事をスピードアップしますか? –

+0

@I__:何かをスピードアップするかどうかはわかりません。これはかなり良いサイズのクエリであり、パフォーマンスの問題は他の場所にある可能性があります。 –

+1

おそらくあなたが必要とするのは、左の結合です。それを除いて、私はこれが解決策だと思います。 – usr

1

長い実行クエリに入る可能性のあるものはたくさんあります。

どこから探し始めますか?

  1. どのくらいのデータですか?大量かつ大量のデータがある場合は、問合せの精度は問わず、問合せは常に長くかかります。しかし、ほとんどのデータベースはかなりの量がかかるので、それは問題ではないと見なすことができます。

  2. テーブルには、参加する列のインデックスがありますか?データベースがインデックスに登録されていない場合は、結合する列を見つける必要があります。このプロセスは本当に長くかかる場合があります。

    Your_TableNameのIX_Your_IndexNameを作成します(Column1、Column2など)。 )

  3. 実行計画を読む方法を学びます。これは、実際にはクエリが遅く実行されている理由を示します。始めるのに最適な場所! Here is an articleを起動してください。

幸運。

関連する問題