带有 SELECT 和 INNER JOIN 的 SQL INSERT INTO

Posted

技术标签:

【中文标题】带有 SELECT 和 INNER JOIN 的 SQL INSERT INTO【英文标题】:SQL INSERT INTO with SELECT and INNER JOIN 【发布时间】:2011-10-25 19:19:57 【问题描述】:

希望你能帮我解决这个小问题。我不太清楚如何向您解释这种情况,所以我会尝试一下。

我想要做的是:

我想在表 RFC_Risks 中插入一些特定的值和参数(我自己输入),所以基本上每次我在表 RCF_Risks 中找到一个特定的原因时,我都想写一个新的行来更新优先级RfC,每次发生这种情况,位置都会增加1。

我现在的问题是,当我运行这个语句时,我只得到了 SELECT 部分:-),没有插入完成,我也没有得到 SQL 语句错误或类似的东西。我只需输入参数,然后我得到一个SELECT 表,仅此而已。

我正在使用 MS Access 2010,希望您能帮我解决我的“小”问题。

INSERT INTO RFC_Risks (RFC_No, RiskPos, Datum, Comments, RiskPrio, Reason)
SELECT RFC_Risks.RFC_No, (RFC_Risks.RiskPos +1) AS RiskPos, [Aktuelles Datum] AS Datum, [Kommentartext] AS Comments, [Neue Prio] AS RiskPrio, RFC_Risks.Reason 
FROM RFC_Risks INNER JOIN Risk_Reasons ON RFC_Risks.Reason = Risk_Reasons.Reasontext 
WHERE RFC_Risks.Reason = Risk_Reasons.Reasontext;

【问题讨论】:

仅供参考,我认为您不需要最后的 WHERE 子句,您的 INNER JOIN 会为您执行此操作 =) 您遇到什么错误或意外结果?这对我来说看起来不错.. @Yuck 听起来他们得到的意外结果是没有记录插入到 RFC_Risks 中(只有 SELECT 部分被执行) 【参考方案1】:

我没有发现任何关于您的 SQL 语句会阻止它执行和/或引发错误的内容。 (我认为您的 WHERE 子句是多余的,但这不应该导致数据库引擎拒绝它。)您使用什么方法来“运行”它?

如果您使用 Access 查询设计器,并从设计视图切换到数据表视图,您的查询实际上并没有执行...数据表视图将向您显示在执行查询时会受到影响的行。

情况与您在查询设计器中构建删除查询相同......数据表视图将显示哪些行将被删除如果查询已执行,但切换到数据表View 不会删除这些行。

执行查询,请单击带有红色感叹号的图标。

【讨论】:

非常感谢您提供的信息,我不知道通过数据表或其他方法执行查询有什么不同,我会尝试一下。【参考方案2】:

尝试将子选择括在括号中。

【讨论】:

我的回答作为评论可能会更好,而不是作为答案,但我还不能对问题发表评论,而且 SQL 对我来说看起来很简单。据我所知,子选择必须始终用括号括起来,所以我认为这可能对你有用。如果这不是解决方案,请务必回复。 所以你的意思是我应该在选择前面放一个括号?插入 RFC_Risks (RFC_No, RiskPos, Datum, Comments, Risk_Prio, Reason) (SELECT RFC_Risks.RFC_No, (RFC_Risks.RiskPos +1) AS RiskPos, [Aktuelles Datum] AS Datum, [Kommentartext] AS Comments, [Neue Prio] AS Risk_Prio, RFC_Risks.Reason FROM Risk_Reasons INNER JOIN RFC_Risks ON Risk_Reasons.Reasontext = RFC_Risks.Reason);【参考方案3】:

您需要执行查询。如果您只在数据表视图中显示它,则会执行 SELECT 语句并将其作为一种预览显示给您。

要真正执行查询,当您处于设计模式时,您可以单击工具栏中的“运行”按钮(红色感叹号)。您也可以在数据库窗口中双击查询。

【讨论】:

谢谢我试过了,现在我输入参数后,我得到一个错误,访问一直告诉我有一个密钥冲突。我不完全确定为什么会发生这种情况,表 RFC_Risks 有 2 个主键,RFC 编号和 RiskPosition,因为一个 rfc 可能有不止一个风险。有什么想法吗? @sXing,您可能正在尝试插入一条与主键值相同的新记录作为表中已经存在的记录(您可能还添加了两个或更多记录它们的主键值相同)。

以上是关于带有 SELECT 和 INNER JOIN 的 SQL INSERT INTO的主要内容,如果未能解决你的问题,请参考以下文章

INNER JOIN到SELECT语句

“INNER JOIN 之前的 Sub SELECT”还是“INNER JOIN 之后的 WHERE”?

JOIN 和 INNER JOIN 的区别

如何使用多个 INNER JOIN 加快查询速度

带有 INNER JOIN 和 WHERE 的 SQL 查询

SQL中LEFT JOIN 和 inner join 的区别