Соединение столов на A или B или C - PullRequest
1 голос
/ 24 февраля 2012

у меня есть таблица:

docname, specialtycode1, specialtycode2, specialtycode3

У меня есть другой стол

    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)

Не думаю, что это правильное решение, но не знаю с чего начать. пожалуйста, помогите!

вот полный запрос:

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Ну, есть много вещей, которые могут войти в длительный запрос.

С чего начать.

  1. Сколько данных?Если у вас есть масса и масса данных, ваш запрос всегда занимает много времени, независимо от того, насколько хорош ваш запрос.Однако большинство баз данных могут потратить довольно много времени, поэтому давайте предположим, что это не проблема.

  2. Индексируете ли вы таблицы для столбцов, к которым вы присоединяетесь?В базе данных необходимо найти столбцы, к которым вы присоединяетесь, если они не проиндексированы, этот процесс может занять очень много времени, индексировать столбцы, к которым вы присоединяетесь, что-то вроде

    , создать кластерный индекс IX_Your_IndexName в Your_TableName (Column1, Column2и т. д.)

  3. Узнайте, как читать план выполнения, это фактически скажет вам, почему ваш запрос выполняется медленно.Отличное место для начала! Вот статья , с которой можно начать.

Удачи.

1 голос
/ 24 февраля 2012

Если у вас есть три «специальных кода» в качестве столбцов в вашей первой таблице, вам понадобится либо три JOIN, либо вы можете отменить вывод данных из таблицы docName и выполнить одно 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 уникальны, это должно работать.

РЕДАКТИРОВАТЬ - Обновлено до LEFT JOIN с согласно предложениям в комментариях. Я также заметил, что имена столбцов не совсем совпадают с именами в вашем запросе, но вы получите суть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...