此代码和另一个代码在Ms-Access中产生逻辑错误,其中它要求参数等于对象名称。在这种情况下,它需要[DSRT_ERS]。[ID]。
INSERT INTO DSRT_ERS
SELECT *
FROM DSRT_TEMP
WHERE [DSRT_ERS].[ID] <>[DSRT_TEMP].[ID];
如果您查看数据库的文档,您会发现它拼写正确。
Table: DSRT_ERS
Properties
AlternateBackShade: 100 AlternateBackTheme -1
AlternateBackTint: 100 BackShade: 100
BackTint: 100 DatasheetForeTheme -1
DatasheetGridlinesTh -1 DateCreated: 6/17/2015 10:15:19 AM
DefaultView: 2 DisplayViewsOnShar 1
FilterOnLoad: False GUID: {guid {BC8AFE53-
8AE3-42B9-AA5A-
HideNewField: False LastUpdated: 6/17/2015 10:21:50 AM
NameMap: Long binary data OrderByOn: False
OrderByOnLoad: True Orientation: Left-to-Right
ReadOnlyWhenDisco False RecordCount: 1022
ThemeFontIndex: -1 TotalsRow: False
Updatable: True
Columns
Name Type Size
ID Text 255
AggregateType: -1
AllowZeroLength: True
AppendOnly: False
Attributes: Variable Length
CollatingOrder: General
ColumnHidden: False
ColumnOrder: Default
ColumnWidth: Default
CurrencyLCID: 0
DataUpdatable: False
DisplayControl: Text Box
Format: @
GUID: {guid {A1301DB4-C42E-4B73-A84B-
IMEMode: 0
IMESentenceMode: 3
OrdinalPosition: 1
Required: False
ResultType: 0
SourceField: ID
SourceTable: DSRT_ERS
TextAlign: General
UnicodeCompression: False
我不确定此时该怎么做。类似的查询会生成此结果(但具有不同的参数),并且所有这些都需要修复。如果有人能提供一些指导,我们将不胜感激。
答案 0 :(得分:2)
似乎您只想插入目标中尚不存在的行。
您无法直接在SELECT中引用目标表。改为将其更改为NOT EXISTS:
INSERT INTO DSRT_ERS
SELECT *
FROM DSRT_TEMP
WHERE NOT EXISTS
(
SELECT * FROM DSRT_ERS
WHERE [DSRT_ERS].[ID] =[DSRT_TEMP].[ID]
);
答案 1 :(得分:2)
试试这个。这将从DSRT_TEMP表中排除[DSRT_ERS]。[ID]并仅插入过滤后的记录。
INSERT INTO DSRT_ERS
SELECT *
FROM DSRT_TEMP
WHERE [DSRT_TEMP].[ID] NOT IN (Select [DSRT_ERS].[ID] FROM [DSRT_ERS]
WHERE [DSRT_ERS].[ID] IS NOT NULL)
有两个选项,@ deoeth建议您NOT IN
和NOT EXISTS
。
请记住选择一个。
如果子查询(内部查询)返回少量数据,[NOT] IN
运算符可能会提供更好的性能。
如果子查询返回大量数据[NOT] EXISTS
,则最好使用运算符。
如果你想摆脱suquery
,你也可以使用Left Outer JoinINSERT INTO DSRT_ERS
SELECT *
FROM DSRT_TEMP
LEFT Outer JOIN [DSRT_ERS] ON [DSRT_TEMP].[ID] = [DSRT_ERS].[ID]
WHERE [DSRT_ERS].[ID] IS NULL