Добавление дополнительных столбцов вместе с UNION

Ниже показано две попытки попыток вставить данные в временную таблицу, используя как запрос объединения, так и два дополнительных столбца (fldBF и sCount)...

ДЕЛО 1:

SELECT *, 1 AS fldBF, 
 ROW_NUMBER() OVER (PARTITION BY fldPK, fldCIA ORDER BY fldPK) AS sCount 
INTO #tmpTable 
FROM V_qryCSPGA 
WHERE fldPK IN(SELECT DISTINCT thePK 
 FROM FN_qryAllDTPK()) 
UNION ALL 
SELECT * 
FROM FN_qryCSGBA() 
WHERE fldPK IN(SELECT DISTINCT thePK FROM FN_qryAllDTPK())
ORDER BY fldPK, fldCIA, fldNDat;

СЛУЧАЙ 2:

SELECT * INTO #tmpTable 
FROM V_qryCSPGA 
WHERE fldPK IN(SELECT DISTINCT thePK FROM FN_qryAllDTPK()) 
UNION ALL 
SELECT *, 1 AS fldBF, 
 ROW_NUMBER() OVER (PARTITION BY fldPK, fldCIA ORDER BY fldPK) AS sCount
FROM FN_qryCSGBA() 
WHERE fldPK IN(SELECT DISTINCT thePK FROM FN_qryAllDTPK())
ORDER BY fldPK, fldCIA, fldNDat;

В любом случае я получаю следующую ошибку... "Все запросы, объединенные с помощью оператора UNION, INTERSECT или EXCEPT, должны иметь равное количество выражений в своих целевых списках". В любом случае, я должен обойти это без необходимости делать какую-то другую вставку?

2 ответа

Вы должны убедиться, что оба запроса выбора возвращают равное количество столбцов. Согласно комментариям, если вам нужно включить дополнительные столбцы, вы можете добавить статические значения в другой запрос выбора. Так,

Добавив (-1) в качестве статических значений, ваш CASE 1 будет похож;

SELECT *, 1 AS fldBF, 
 ROW_NUMBER() OVER (PARTITION BY fldPK, fldCIA ORDER BY fldPK) AS sCount 
INTO #tmpTable 
FROM V_qryCSPGA 
WHERE fldPK IN(SELECT DISTINCT thePK FROM FN_qryAllDTPK()) 

UNION ALL 

SELECT *, -1 AS fldBF, -1 AS sCount --NOTE: Two static fields 
FROM FN_qryCSGBA() 
WHERE fldPK IN(SELECT DISTINCT thePK FROM FN_qryAllDTPK())
ORDER BY fldPK, fldCIA, fldNDat;

Вы можете сделать то же самое со вторым запросом.


Ваши запросы не эквивалентны. Как говорится в сообщении об ошибке, оба оператора select должны содержать одни и те же столбцы. В вашем первом примере только ваш первый оператор выбора имеет fldBF и sCount. В вашем втором примере только ваш второй запрос имеет fldBF и sCount. Поскольку вы используете синтаксис SELECT *, вы также можете столкнуться с этой проблемой, если одна таблица имеет больше/меньше столбцов, чем другая.

Вы не опубликовали то, что выглядели две таблицы ввода, поэтому я собираюсь предположить, что они немного разные таблицы. Мое предложение состояло в том, чтобы использовать такой запрос, как следующий.

Вы можете удалить инструкции IN и использовать соединение, но опять же я не знаю, как выглядят ваши таблицы.

SELECT 
 ROW_NUMBER() OVER(ORDER BY field1) AS custField1, 
 1 AS *****, 
 * 
INTO #tmp_tbl 
FROM (
 SELECT 
 field1, 
 field2, 
 field3, 
 'X' AS field4 
 FROM V_qryCSPGA 
 WHERE my_pk IN (SELECT DISTINCT some_pk FROM My_Fn())
 UNION ALL
 SELECT 
 'A' AS field1, 
 field5 AS field2, 
 field3, 
 field4 
 FROM FN_qryCSGBA()
) X;

licensed under cc by-sa 3.0 with attribution.