2015-05-21 1 views
4

Попросите простой запрос UNION ALL, выйдя замуж за результаты двух запросов. Первый запрос, самостоятельно запускаться, возвращает 1208 записей, а второй 14. Я хотел бы ожидать правильно syntaxed UNION ALL вернуть 1222 записей, но мои падает до 896.T-SQL [UNION ALL] удаление записей из результата запроса

делает нулевой смысл для меня:

SELECT a.WBS_ELEMENT_ID as [WBS Element], 
a.WBS_ELEMENT_DESC as [WBS Element Desc], 
a.UHC_INDUSTRY as [Industry], 
a.UHC_SECTOR as [Sector], 
a.UHC_DUNS_NUMBER as [UHC DUNS Number], 
a.UHC_DUNS_NAME as [UHC DUNS Name], 
a.PRIORITY_SUB_SECTOR as [Priority Sub Sector], 
a.BUDGET_ALLOCATION as [Budget Allocation], 
a.LAST_UPDATED_ON as [Last Updated] 
FROM DimSectorPd a 
WHERE a.wbs_element_id is not null 

UNION ALL 

SELECT ROW_NUMBER() OVER (ORDER BY a.wbs_element_desc) as [WBS Element], 
a.WBS_ELEMENT_DESC as [WBS Element name], 
a.UHC_INDUSTRY as [Industry], 
a.UHC_SECTOR as [Sector], 
a.UHC_DUNS_NUMBER as [UHC DUNS Number], 
a.UHC_DUNS_NAME as [UHC DUNS Name], 
a.PRIORITY_SUB_SECTOR as [Priority Sub Sector], 
a.BUDGET_ALLOCATION as [Budget Allocation], 
a.LAST_UPDATED_ON as [Last Updated] 
from dimsectorpd a where a.WBS_ELEMENT_ID is null 
+0

Вы смотрели, чтобы увидеть, какие записи не являются в конечном итоге? Есть ли там шаблон? –

+0

Выстрел в темноте. Но попробуйте дать второму запросу другой псевдоним. Также я задаюсь вопросом, кэшируется ли какой-то другой результат запроса, и это то, что дает неверный результат. И наконец, это ROW_NUMBER() является подозрительным. – dotnetN00b

+0

Я бы вынул ROW_NUMBER() и оставил нулевое значение во втором запросе, чтобы убедиться, что вы возвращаете 1222 записи. – FutbolFan

ответ

1

Ваши запросы должны возвращать все строки в таблице. Если таблица не изменится между выполнением, результаты запуска подзапросов по отдельности должны быть такими же, как и при их запуске с помощью UNION ALL.

Как примечание, если вы хотите упростить запрос, то вы можете сделать:

SELECT COALESCE(a.WBS_ELEMENT_ID, 
       ROW_NUMBER() OVER (PARTITION BY wbs_element_id ORDER BY a. wbs_element_desc) 
       ) as [WBS Element], 
     a.WBS_ELEMENT_DESC as [WBS Element Desc], 
     a.UHC_INDUSTRY as [Industry], 
     a.UHC_SECTOR as [Sector], 
     a.UHC_DUNS_NUMBER as [UHC DUNS Number], 
     a.UHC_DUNS_NAME as [UHC DUNS Name], 
     a.PRIORITY_SUB_SECTOR as [Priority Sub Sector], 
     a.BUDGET_ALLOCATION as [Budget Allocation], 
     a.LAST_UPDATED_ON as [Last Updated] 
FROM DimSectorPd a; 
+0

^Это был билет. Хотя я в конечном итоге использовал функцию ISNULL, так как у меня было некоторое отклонение в типах данных в столбце WBS_ELEMENT_ID. COALESCE выдает все, что не похоже на один и тот же тип данных. – user2891330

+0

Верно, что 'ISNULL()' и 'COALESCE()' могут иметь разные типы возврата. Интересно, что это действительно повлияло на ваше приложение. Вот статья на тему: http://sqlmag.com/t-sql/coalesce-vs-isnull. –

0

Очевидно, что нет ничего плохого в вашем синтаксисе, но если вы хотите попробовать другой подход, чтобы получить UNION ALL для работы с ROW_NUMBER. Вот он:

;WITH q1 
AS (
    SELECT a.WBS_ELEMENT_ID AS [WBS Element] 
     ,a.WBS_ELEMENT_DESC AS [WBS Element Desc] 
     ,a.UHC_INDUSTRY AS [Industry] 
     ,a.UHC_SECTOR AS [Sector] 
     ,a.UHC_DUNS_NUMBER AS [UHC DUNS Number] 
     ,a.UHC_DUNS_NAME AS [UHC DUNS Name] 
     ,a.PRIORITY_SUB_SECTOR AS [Priority Sub Sector] 
     ,a.BUDGET_ALLOCATION AS [Budget Allocation] 
     ,a.LAST_UPDATED_ON AS [Last Updated] 
    FROM DimSectorPd a 
    WHERE a.wbs_element_id IS NOT NULL 

    UNION ALL 

    SELECT b.WBS_ELEMENT_ID AS [WBS Element] --just bring NULL values 
     ,b.WBS_ELEMENT_DESC AS [WBS Element name] 
     ,b.UHC_INDUSTRY AS [Industry] 
     ,b.UHC_SECTOR AS [Sector] 
     ,b.UHC_DUNS_NUMBER AS [UHC DUNS Number] 
     ,b.UHC_DUNS_NAME AS [UHC DUNS Name] 
     ,b.PRIORITY_SUB_SECTOR AS [Priority Sub Sector] 
     ,b.BUDGET_ALLOCATION AS [Budget Allocation] 
     ,b.LAST_UPDATED_ON AS [Last Updated] 
    FROM dimsectorpd b 
    WHERE b.WBS_ELEMENT_ID IS NULL 
    ) 
SELECT CASE 
     WHEN q1.[WBS Element] IS NULL 
      THEN ROW_NUMBER() OVER (ORDER BY q1.WBS_Element_Desc) 
     ELSE q1.[WBS Element] 
     END [WBS_Element] 
    ,q1.[WBS Element Desc] 
    ,q1.Industry 
    ,q1.Sector 
    ,q1.[UHC DUNS Number] 
    ,q1.[UHC DUNS Name] 
    ,q1.[Priority Sub Sector] 
    ,q1.[Budget Allocation] 
    ,q1.[Last Updated] 
FROM q1 
0

Вот упрощенный пример, можете ли вы увидеть, работает ли он на вашем сервере?

SELECT a.low AS [My ID], 
    a.name AS [My Letter] 
FROM master..spt_values as a 
WHERE low is not null 

UNION ALL 

SELECT ROW_NUMBER() OVER (ORDER BY a.name) AS [My ID], 
    a.name AS [My Letter] 
FROM master..spt_values as a 
WHERE a.low is null 

master..spt_values ​​как 2515 строк на моей системе ...

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