Вставка SQL в оператор WITH приводит к непредвиденной ошибке вставки - PullRequest
0 голосов
/ 26 июня 2019

Как часть моего SQL-запроса, я сначала создаю таблицу с именем «new» на основе определенных условий, а затем insert into new таблица некоторых столбцов из другой таблицы old на основе определенных условий. Вот упрощенная версия того, что я пытаюсь сделать:

   item    | subitem    |   stage    |   id     | 
    -----------------------------------------------
    i1      | s1         |  picked    |    1     |
    i1      | s2         |  shipped   |    1     |
    i2      | s4         |  picked    |    2     |
    i3      | s10        | shipped    |    2     |
    i3      | s11        | eligible   |    0     |
    i4      | s2         |not eligible|    0     |
    i1      | s1         |  picked    |    3     |
    i1      | s2         |  picked    |    3     |

Я хочу получить следующий вывод:

    item1|subitem1|item2|subitem2|pair_volume|item1pick|item1ship|item2pick|item2ship|
-------------------------------------------------------------------------------------
    i1   |   s1   |  i1 | s2     | 2         |  2      | 0       | 2       | 1       |
    i1   | s1     | i2  | s4     | 1         |1        | 0       | 1       | 1       |  
    ....
    .....
    ....

По сути, я хочу сделать следующее:

Я хочу сначала сделать перекрестное соединение item, subitem с самим собой, поэтому у меня есть все возможные комбинации item1, subitem1 и item2, subitem2.

Вот как определяются этапы. Если стадия является приемлемой, то она является приемлемой, тогда как если стадия выбрана, то это означает, что элемент является приемлемым и выбранным. Если этап доставлен, это означает, что предмет имеет право, выбран и доставлен. Упоминается только последний этап.

Теперь для каждой пары item1, subitem1 - item2, subitem2 я хочу рассчитать количество id сеансов, где эта пара встречается и имеет этап в (eligible, shipped, picked), и заполнить значение в pair_volume. Например, пара (i1,s1)-(i1,s2) встречается дважды (один раз в id 1 и один раз в id 3), и в обеих этих id сессиях оба элемента в паре были eligible (что подразумевается из picked и shipped) этапы. Из 2 раз, когда эта подходящая пара встречалась, сколько раз было выбрано item1, item2 поднято, item1 отправлено и item2 отправлено? Это то, что я пытаюсь решить.

У меня все хорошо, пока не кросс-соединение. Но я не знаю, как вставить значения в таблицу перекрестных соединений. Реальная проблема более сложна, чем я упомянул здесь. Любая помощь высоко ценится! Вот такой у меня запрос:

with new as
(
select combination.item1, combination.subitem1, combination.item2, 
combination.subitem2,
    (
    select tmp.item1, tmp.subitem1, tmp.item2, tmp.subitem2,
    case when ((tmp.item1 = tmp.item2) and 
    (tmp.subitem1 = tmp.subitem2)) then 'TRUE' else 
    'FALSE' end as indicator from
        (
        select distinct item as item1, subitem as subitem2
        from old
        cross join
        select distinct item as item2, subitem as subitem2 
        from old
        ) tmp
    ) combination
where combination.indicator = 'FALSE'
)
insert into new (pair_volume)
select count(id) as pair_volume
from old
where ((new.item1 = old.item) and (new.subitem1 = old.subitem) and 
stage 
in ('picked', 'eligible', 'shipped')) and
((new.item2 = old.item) and (new.subitem2 = old.subitem) and 
stage 
in ('picked', 'eligible', 'shipped')

Это, по сути, то, что я пытаюсь сделать здесь, и оператор insert into продолжает выдавать ошибку. Партия до cross join работает нормально. Но у меня возникают проблемы при вставке значений в таблицу, а также при создании правильных условий для выходной таблицы, которую я хочу. Любая помощь очень ценится !!

Однако, это выдает ошибку для меня следующим образом:

Ошибка компиляции SQL: синтаксическая ошибка, строка 4 в позиции 0, неожиданная «вставка».

Я пытался включить точку с запятой перед оператором insert into, вот что я получаю:

Ошибка компиляции SQL: строка синтаксической ошибки 3 в позиции 1 неожиданно ';'.

Я пытался добавить запятую , перед оператором insert into, вот что я получаю:

Ошибка компиляции SQL: синтаксическая ошибка, строка 4 в позиции 0, неожиданная «вставка». Синтаксическая ошибка строки 5 в позиции 0 неожиданного «выбора».

Что я здесь не так делаю? Основываясь на множестве других постов, я решил, что именно так мы используем insert into с CTE.

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Если вы не обязаны использовать CTE (в основном использование CTE не имеет особого смысла, когда вы хотите создать новую таблицу), вы можете попробовать, например:

INSERT INTO new (tmp1, tmp2)
SELECT tmp1,tmp2
FROM old

Редактировать: Предполагая SQL Server

0 голосов
/ 26 июня 2019

Как указано в комментариях, вы очень близки, но CTE не создает таблицу, поэтому она не работает.

Этот бит в порядке:

with new as
(
select combination.item1, combination.subitem1, combination.item2, 
combination.subitem2,
    (
    select tmp.item1, tmp.subitem1, tmp.item2, tmp.subitem2,
    case when ((tmp.item1 = tmp.item2) and 
    (tmp.subitem1 = tmp.subitem2)) then 'TRUE' else 
    'FALSE' end as indicator from
        (
        select distinct item as item1, subitem as subitem2
        from old
        cross join
        select distinct item as item2, subitem as subitem2 
        from old
        ) tmp
    ) combination
where combination.indicator = 'FALSE'
)

Следующая строка:

insert into new (pair_volume)

Вы не можете вставить в новый. Там нет таблицы под названием "новый". Даже если бы вы могли вставить в CTE, нет столбца с именем pair_volume.

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

У вас есть фиксированное количество подразделов? Если нет, он становится более сложным, и вам нужно будет использовать динамический SQL для построения запроса, чтобы получить желаемый результат, или, если ваша СУБД поддерживает его, вы можете использовать SELECT INTO для динамического создания таблицы из набора результатов.

...