从 SEQ NUM <> 2 的临时表插入

Posted

技术标签:

【中文标题】从 SEQ NUM <> 2 的临时表插入【英文标题】:Insert from tempt table where SEQ_NUM <> 2 【发布时间】:2019-04-02 20:11:43 【问题描述】:

我正在尝试从临时表中的数据中插入下表PS_VNDR_ADDR_SCROL,其中表中还没有插入PS_VNDR_ADDR_SCROL 的行,其SEQ_NUM 等于2相同的VENDOR_ID

下面的 SQL 运行但没有插入任何行,我知道应该有 132 条记录满足这个条件。

INSERT PS_VNDR_ADDR_SCROL 
SELECT 'SHARE', A.VENDOR_ID, 2, 'HOME', 'BUSN', ''
FROM #DepWork2 A
WHERE NOT EXISTS (
    SELECT VENDOR_ID 
    FROM PS_VNDR_ADDR_SCROL B 
    WHERE B.VENDOR_ID = A.VENDOR_ID AND SEQ_NUM <> 2
)

我也尝试过如下使用NOT IN,但出现语法错误:

INSERT PS_VNDR_ADDR_SCROL 
SELECT 'SHARE', A.VENDOR_ID, 2, 'HOME', 'BUSN', ''
FROM #DepWork2 A
WHERE NOT IN (
    SELECT VENDOR_ID 
    FROM PS_VNDR_ADDR_SCROL B 
    WHERE B.VENDOR_ID = A.VENDOR_ID AND SEQ_NUM <> 2
)

【问题讨论】:

【参考方案1】:

插入下表PS_VNDR_ADDR_SCROL [...],其中表中已有一行[...] PS_VNDR_ADDR_SCROL SEQ_NUM 等于2对于相同的VENDOR_ID

您使用NOT EXISTS 的方法看起来不错,但我认为,为了符合您的规范,相关子查询应该拼写:

SELECT VENDOR_ID 
FROM PS_VNDR_ADDR_SCROL B 
WHERE B.VENDOR_ID = A.VENDOR_ID AND SEQ_NUM = 2

代替:

SELECT VENDOR_ID 
FROM PS_VNDR_ADDR_SCROL B 
WHERE B.VENDOR_ID = A.VENDOR_ID AND SEQ_NUM <> 2

因此,请尝试:

INSERT PS_VNDR_ADDR_SCROL 
SELECT 
    'SHARE', 
    A.VENDOR_ID, 
    2, 
    'HOME', 
    'BUSN', 
    ''
FROM #DepWork2 A
WHERE NOT EXISTS (
    SELECT 1 
    FROM PS_VNDR_ADDR_SCROL B 
    WHERE B.VENDOR_ID = A.VENDOR_ID AND SEQ_NUM = 2
)

注意:第二个查询中的语法错误来自这部分 SQL 代码:

...
WHERE NOT IN (
    SELECT VENDOR_ID 
    ...
)

您需要在NOT IN 条件的左侧指定一列。这应该是:

...
WHERE A.VENDOR_ID NOT IN (
    SELECT VENDOR_ID 
    ...
)

注意:当然,第二个查询也应该有条件SEQ_NUM = 2,而不是相关子查询中的SEQ_NUM &lt;&gt; 2

【讨论】:

使用 NOT EXISTSSEQ_NBR = 2 可以正常工作,谢谢。【参考方案2】:

尝试使用存在

INSERT PS_VNDR_ADDR_SCROL 
SELECT 'SHARE', A.VENDOR_ID, 2, 'HOME', 'BUSN', ''
FROM #DepWork2 A
WHERE  EXISTS (SELECT 1  FROM PS_VNDR_ADDR_SCROL B  WHERE B.VENDOR_ID = A.VENDOR_ID AND SEQ_NUM = 2)

【讨论】:

如果我将其更改为WHERE EXISTS,则会出现重复键插入错误。

以上是关于从 SEQ NUM <> 2 的临时表插入的主要内容,如果未能解决你的问题,请参考以下文章

SQL里怎么用UPDATE 更新大量SELECT 数据

顺序表的实现---动态

临时表

oracle 临时表

ORACLE存储过程创建临时表并插入数据。

PHP PDO 等效于 mysql_num_rows [重复]