使用 WITH 语句中的 SQL 插入会引发意外的'insert'错误



作为SQL查询的一部分,我首先根据某些条件创建一个名为'new'的表,然后根据某些条件insert intonew表中不同表中的一些列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的交叉连接,所以我有item1subitem1item2subitem2的所有可能组合。

以下是阶段的定义方式。如果一个阶段符合条件,那么它只是有资格,而如果一个阶段被选中,则意味着该项目既符合条件又被选中。如果某个阶段已发货,则表示该商品符合条件、已拣选和发货。只提到了最后一个阶段。

现在,对于每个item1, subitem1 - item2, subitem2对,我想计算该对发生并具有阶段(eligible, shipped, picked)id会话计数,并以pair_volume填充值。例如,(i1,s1)-(i1,s2)对出现两次(一次在第 1id,一次在id3),并且在这两个id会话中,对中的两个项目都eligible(这在pickedshipped中暗示)。在符合条件的货币对出现的 2 次中,第 1 件被拣选、第 2 件被拣选、第 1 件已发货和商品 2 已发货的次数是多少次?这就是我试图解决的问题。

我可以做得很好,直到交叉连接。但是我不知道如何将值插入交叉连接的表中。真正的问题比我在这里提到的要复杂得多。任何帮助都非常感谢! 这是我到目前为止的查询:

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 编译错误:位置 1 处的语法错误行 3 意外的";"。

我尝试在insert into语句之前包含一个逗号,,这就是我得到的:

SQL 编译错误:语法错误行 4 位于位置 0 意外的">

插入"。 语法错误行 5 位于位置 0 意外的"选择"。

我在这里做错了什么?根据许多其他帖子,我认为这就是我们将insert into与 CTE 一起使用的方式。

如果您没有义务使用CTE(基本上当您想创建新表时,使用 CTE 没有多大意义),您可以尝试,例如:

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

编辑:假设SQL Server

如评论中所述,您非常接近,但 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来构建查询以获得所需的结果,或者如果您的RDBMS支持它,则可以使用SELECT INTO从结果集动态创建表。

最新更新