В таблице X должно быть не менее пяти столбцов, имена которых, как мы можем предположить, являются a
, b
, c
, x
, y
.
Если вы делаете одну ВСТАВКУ, то вам нужно вставить ее во все пять столбцов. Если вы выполняете несколько операций INSERT, вы можете вставить в 3, а затем 5 (или наоборот) столбцов. Возможно, вам придется выполнить некоторые манипуляции со значениями NULL в списке выбора первой альтернативы. Я предполагаю, что столбцы x
и y
являются INTEGER для определенности - выберите подходящий тип.
1-ая альтернатива
INSERT INTO x(a, b, c, x, y)
SELECT a, b, c, MAX(CAST(NULL AS INTEGER)) AS x, MAX(CAST(NULL AS INTEGER)) AS y
FROM pqr
WHERE p_a IS NULL
GROUP BY a, b, c
UNION
SELECT MAX(a) AS a, MAX(b) AS b, MAX(c) AS c, x, y
FROM pqr
WHERE p_a IS NOT NULL
GROUP BY x, y;
Вы можете заменить предложение GROUP BY a, b, c
на DISTINCT перед a
в списке выбора первой части UNION. В большинстве СУБД SQL необходимо перечислить все неагрегированные столбцы из списка выбора в предложении GROUP BY. Использование MAX означает, что у вас есть агрегаты для x
и y
в первой половине UNION и для a
, b
и c
во второй половине UNION.
2-ой вариант
INSERT INTO x(a, b, c)
SELECT DISTINCT a, b, c
FROM pqr
WHERE p_a IS NULL;
INSERT INTO x(a, b, c, x, y)
SELECT MAX(a) AS a, MAX(b) AS b, MAX(c) AS c, x, y
FROM pqr
WHERE p_a IS NOT NULL
GROUP BY x, y;
Как обсуждалось ранее, вам нужны агрегаты по столбцам, которых нет в списке GROUP BY.
3-й вариант
Если вы имели в виду, что вы должны сгруппировать по x
и y
, а также a
, b
и c
, то вторая половина UNION (или второй SELECT) упрощается до:
SELECT a, b, c, x, y
FROM pqr
WHERE p_a IS NOT NULL
GROUP BY a, b, c, x, y;
Или вы можете снова использовать DISTINCT:
SELECT DISTINCT a, b, c, x, y
FROM pqr
WHERE p_a IS NOT NULL;