2014-12-05 4 views
-7

Я хотел бы объединить две таблицы на основе значения столбцаInner Join на основе значения столбца в SQL Server 2008

  • если pm.ServiceLevelID значение 1 или NULL то внутреннее соединение на u.FacilityId
  • если pm.ServiceLevelID значение 2, то внутреннее соединение на u.FacilityServiceId

эти две таблицы pm, u имеют следующие столбцы:

ProviderMessages 
    MessageID, FacilityServiceID, ServiceLevelID, FacilityID, ProviderTypeID 

User_FA 
    FacilityServiceId, UserFacilityID, FacilityId 

В настоящее время у меня есть этот INNER JOIN

SELECT DISTINCT 
    MessageID, UserFacilityID, 9  
FROM 
    #ProviderMessages 
INNER JOIN 
    #User_FA ON (#User_FA.FacilityId = #ProviderMessages.FacilityID OR 
            #ProviderMessages.FacilityID IS NULL) 
      AND (#User_FA.FacilityServiceId = #ProviderMessages.FacilityServiceID) 
+0

use [Case] ​​(http://msdn.microsoft.com/en-us/library/ms181765.aspx) –

+1

Мне интересно, что к этому вопросу так плохо. -5, правда? –

ответ

-1

Это ваш запрос, с алиасов таблиц, чтобы сделать его более удобным для чтения:

SELECT DISTINCT MessageID, UserFacilityID, 9  
FROM #ProviderMessages m INNER JOI 
    #User_FA u 
    ON (u.FacilityId = m.FacilityID OR m.FacilityID IS NULL) AND 
     u.FacilityServiceId = m.FacilityServiceID; 

Логика вы хотите

SELECT DISTINCT MessageID, UserFacilityID, 9  
FROM #ProviderMessages m INNER JOIN 
    #User_FA u 
    ON ((pm.ServiceLevelID = 1 or pm.ServiceLevelID is null) AND pm.FacilityId = u.facilityId) or 
     (pm.ServiceLevelID = 2 and pm.FacilityServiceID = m.FacilityServiceID) 
+0

Каков результат неправильный? Это то, о чем вы просите. – Paparazzi

+0

Каков результат, и что вы ожидали от него? Простой «это не то, что я хотел» не помогает никому после решения, которое вы действительно после. – user2366842

-2

Объединение двух результатов


SELECT DISTINCT MessageID, UserFacilityID, 9  
FROM #ProviderMessages 
INNER JOIN #User_FA ON (#User_FA.FacilityId = #ProviderMessages.FacilityID OR 
            #ProviderMessages.FacilityID IS NULL) 
WHERE #ProviderMessages.ServiceLevel <> 2 

UNION 

SELECT DISTINCT MessageID, UserFacilityID, 9  
FROM #ProviderMessages 
INNER JOIN #User_FA ON (#User_FA.FacilityServiceId = #ProviderMessages.FacilityServiceID) 
WHERE #ProviderMessages.ServiceLevel = 2 
0
SELECT DISTINCT MessageID, UserFacilityID, 9  
FROM #ProviderMessages 
JOIN #User_FA 
    ON #ProviderMessages.ServiceLevelID in (null,1,2) 
    and ( (#ProviderMessages.ServiceLevelID in (null,1) 
      and #User_FA.FacilityId = #ProviderMessages.FacilityID) 
     or 
     (ProviderMessages.ServiceLevelID = 2 
      AND #User_FA.FacilityServiceId = #ProviderMessages.FacilityServiceID) 
    ) 
+0

В чем преимущество добавления предложения '# ProviderMessages, ServiceLevelID в (null, 1,2) и'? – Beth

+0

@Beth Я не думаю, что это может повредить. И я думаю, что это позволяет оптимизатору запросов выбросить материал раньше. – Paparazzi

+0

Угадайте, это зависит от масштаба. Я сомневаюсь, что есть другие ценности. – Beth

-1

Я не уверен, если я хорошо понимал, но в моей предыдущей работе мы имели подобные ситуации. Пожалуйста, попробуйте следующее:

SELECT DISTINCT 
    MessageID, UserFacilityID, 9  
FROM 
    #ProviderMessages 
    INNER JOIN #User_FA 
     ON (CASE WHEN ISNULL(#ProviderMessages.ServiceLevelID, 1) = 1 
       THEN #ProviderMessages.FacilityID 
       ELSE #ProviderMessages.FacilityServiceId 
      END) 
      = (CASE WHEN ISNULL(#ProviderMessages.ServiceLevelID, 1) = 1 
       THEN #User_FA.FacilityId 
       ELSE #User_FA.FacilityServiceId 
       END) 

Я надеюсь, что это помогает.

Смежные вопросы