从 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 <> 2
。
【讨论】:
使用NOT EXISTS
和 SEQ_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 的临时表插入的主要内容,如果未能解决你的问题,请参考以下文章