2

Я пытаюсь получить UNION ALL, работающий с CTE, который я использую для подкачки. Мне нужно, чтобы все записи соответствовали набору критериев из двух таблиц, а затем отображали результаты. КТР Первая таблица выглядит следующим образом:UNION ALL in CTE

;WITH Results_CTE AS (SELECT t1.SomeIntKey1, ROW_NUMBER() OVER (ORDER BY SomeIntKey1) AS RowNum 
FROM Table1 t1 
LEFT JOIN CalculatedData d ON d.Key = t1.SomeIntKey1 
WHERE Postcode LIKE 'CHX 1XX%' 
) SELECT * FROM Results_CTE a INNER JOIN CalclatedData d ON a.SomeIntKey1 = d.Key WHERE RowNum >= 0 AND RowNum <= 10 OPTION(RECOMPILE) 

второй таблицы в пейджинг SQL (который работает отлично) является:

;WITH Results_CTE AS (SELECT t2.SomeIntKey2, ROW_NUMBER() OVER (ORDER BY SomeIntKey2) AS RowNum 
FROM Table2 t2 
LEFT JOIN CalculatedData d ON d.Key = t1.SomeIntKey2 
WHERE Postcode LIKE 'CHX 1XX%' 
) SELECT * FROM Results_CTE a INNER JOIN CalclatedData d ON a.SomeIntKey2 = d.Key WHERE RowNum >= 0 AND RowNum <= 10 OPTION(RECOMPILE) 

Для комбинированных выгружаемого данных, я пытался что-то вроде:

;WITH Results_CTE AS (SELECT t2.SomeIntKey2, ROW_NUMBER() OVER (ORDER BY SomeIntKey2) AS RowNum 
FROM Table2 t2 
LEFT JOIN CalculatedData d ON d.Key = t1.SomeIntKey2 
WHERE Postcode LIKE 'CHX 1XX%' 
UNION ALL 
SELECT t1.SomeIntKey1 
FROM Table1 t1 
LEFT JOIN CalculatedData d ON d.Key = t1.SomeIntKey1 
WHERE Postcode LIKE 'CHX 1XX%' 
) SELECT * FROM Results_CTE a INNER JOIN CalclatedData d ON a.SomeIntKey2 = d.Key WHERE RowNum >= 0 AND RowNum <= 10 OPTION(RECOMPILE) 

Однако это приводит к ошибке: All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

Я знаю, что UNION ALLs могут сбивать с толку в лучшие времена, особенно с объединениями, но я по существу получаю список ключей INT из двух таблиц, а затем присоединяю их к третьему, который содержит нужные мне данные (ключи из обеих таблиц будет присутствовать в объединенной колонке таблицы Data.

+0

Когда вы 'ВЫБРАТЬ t1.SomeIntKey1 FROM Table1 t1' что вы ожидаете номер строки быть? Вы не указали это. Вы имели в виду союз, прежде чем вычислять номер строки? –

+0

Это имеет смысл и, кажется, работает без 'ROW_NUMBER'. Где я должен помещать 'ROW_NUMBER', хотя для включения пейджинга? – Echilon

ответ

5

Вы должны убедиться, что оба результирующие наборы имеют одинаковые столбцы:

WITH Results_CTE AS 
(
    SELECT 
     t2.SomeIntKey2 as Key, 
     ROW_NUMBER() OVER (ORDER BY SomeIntKey2) AS RowNum 
    FROM 
     Table2 t2 
    LEFT JOIN CalculatedData d 
     ON d.Key = t1.SomeIntKey2 
    WHERE Postcode LIKE 'CHX 1XX%' 
    UNION ALL 
    SELECT 
     t1.SomeIntKey1 as Key, 
     0 as RowNum 
    FROM 
     Table1 t1 
    LEFT JOIN CalculatedData d 
     ON d.Key = t1.SomeIntKey1 
    WHERE Postcode LIKE 'CHX 1XX%' 
) 
SELECT * FROM Results_CTE a INNER JOIN CalclatedData d ON a.SomeIntKey2 = d.Key 
WHERE RowNum >= 0 AND RowNum <= 10 OPTION(RECOMPILE) 

Пожалуйста, обратите внимание, что вторая часть UNION ALL теперь всегда возвращает 0 для RowNum. Если вы хотите иметь столбец ROWNUM для результата из UNION ALL вам нужен другой суб-запрос:

WITH Results_CTE AS 
(
    SELECT 
     s.Key, 
     ROW_NUMBER() OVER (ORDER BY s.Key) AS RowNum 
    FROM 
    (
     SELECT 
      t2.SomeIntKey2 as Key, 
     FROM 
      Table2 t2 
      LEFT JOIN CalculatedData d 
       ON d.Key = t1.SomeIntKey2 
     WHERE Postcode LIKE 'CHX 1XX%' 
     UNION ALL 
     SELECT 
      t1.SomeIntKey1 as Key 
     FROM 
      Table1 t1 
      LEFT JOIN CalculatedData d 
       ON d.Key = t1.SomeIntKey1 
     WHERE Postcode LIKE 'CHX 1XX%' 
    ) 
) 
SELECT * FROM Results_CTE a INNER JOIN CalclatedData d ON a.SomeIntKey2 = d.Key 
WHERE RowNum >= 0 AND RowNum <= 10 OPTION(RECOMPILE) 
+0

Спасибо. Проблема заключалась не в выборе среднего выбора. Кажется неприятным, но выполняет эту работу. – Echilon

1

Ваш второй ВЫБРАТЬ в вашем UNION ALL не возвращает то же число столбцов, следовательно, проблема.

Try:

;WITH Results_CTE AS (
    SELECT IntKey, ROW_NUMBER() OVER (ORDER BY IntKey) AS RowNum 
    FROM 
    (
    SELECT t2.SomeIntKey2 AS IntKey 
    FROM Table2 t2 
     LEFT JOIN CalculatedData d ON d.Key = t1.SomeIntKey2 
    WHERE Postcode LIKE 'CHX 1XX%' 
    UNION ALL 
    SELECT t1.SomeIntKey1 AS IntKey 
    FROM Table1 t1 
     LEFT JOIN CalculatedData d ON d.Key = t1.SomeIntKey1 
    WHERE Postcode LIKE 'CHX 1XX%' 
) t 
) 
SELECT * FROM Results_CTE a INNER JOIN CalclatedData d ON a.IntKey = d.Key