【问题标题】:SQL Insert Query With Condition带条件的 SQL 插入查询
【发布时间】:2023-03-22 00:44:01
【问题描述】:

我试图在满足条件时将值插入表的 1 列。

注意:该表已包含所有列的数据,但 1 为空。我想根据 WHERE 子句将值插入到这 1 列中。

我有这个问题:

INSERT INTO <TABLE_NAME>
(COLUMN_NAME)
(VALUE)
WHERE <CONDITION>

我遇到了一个异常:

WHERE 关键字附近的语法不正确

我可以使用 UPDATE 来做到这一点:

UPDATE <TABLE_NAME>
SET <COL_NAME>
WHERE <CONDITION>

但是想知道为什么 INSERT 查询失败了。任何建议表示赞赏。

【问题讨论】:

  • 您能澄清一下您要做什么吗?也许提供一些示例数据?
  • 带有 where 条件的插入会做什么?您是否尝试更新?
  • 恐怕还没有在表中的行不能满足条件。
  • 什么意思 - 试图将值插入 1 列。这是否意味着其他列值已经存在但特定列值不存在?
  • @Mureinik 帖子的标题很清楚。如何根据条件进行插入?

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

据我了解您的问题,您已经在一行中有数据,而该行中的一列没有值,因此您想在该列中添加值。

这是更新现有行的场景,而不是插入新行。当数据已经存在并且您想要修改记录时,您必须使用 UPDATE 子句。当您要在表格中插入新行时选择插入。

因此,在您当前的情况下,更新子句是您与 Where 子句的朋友,因为您想修改记录的子集而不是全部。

UPDATE <TABLE_NAME>
SET <COL_NAME>
WHERE <CONDITION>

根据任何 RDBMS 语法(我认为),INSERT 子句没有任何 Where 子句。 Insert 是无条件的 sql 查询,而 SELECT、UPDATE、DELETE 都是条件命令,可以在后面的所有语句中添加 Where 子句。

【讨论】:

    【解决方案2】:

    要在已填充行的情况下向一列添加值,您需要使用更新语句。
    如果需要插入具有 where 子句的新行,则需要使用 insert into select 语句:

    INSERT INTO <table> (<columns>)
    SELECT <columns>
    FROM <table>
    WHERE <condition>;
    

    【讨论】:

    • INSERT INTO SELECT 命令先从另一个表中选择记录,然后插入,没有where子句或条件插入到主表中
    【解决方案3】:

    SQL Insert 不接受 where 参数,你可以检查一下:SQL Insert Definition...

    我不知道您想要做什么的全部问题,但仅使用 INSERT 语句是不可能的,但是如果该数据依赖于另一个表或来自另一张桌子...检查这里...SQL Insert explain in wikipedia

    像这样:

    从其他表复制行

    INSERT INTO phone_book2
    SELECT *
    FROM   phone_book
    WHERE  name IN ('John Doe', 'Peter Doe')
    

    INSERT INTO phone_book2 ( [name], [phoneNumber] )
    SELECT [name], [phoneNumber]
    FROM   phone_book
    WHERE  name IN ('John Doe', 'Peter Doe')
    

    【讨论】:

      【解决方案4】:

      根据您的问题,我感觉您正在尝试更新表中的列而不是插入。

      类似:

      UPDATE column SET value WHERE different_column_value = some_value
      

      【讨论】:

        【解决方案5】:

        我知道这有点晚了,对于那些仍然想在插入查询中使用 where 子句的人来说,这有点可能通过 hack。

        我的理解是,您只想在条件为真时插入。假设您的数据库“姓氏”中有一个列,并且您只想在表中不存在姓氏时插入。

        你有点想要 INSERT INTO table_name blha blha blah WHERE surname!="this_surname" 之类的东西。

        解决方案是使该单元格在您的管理面板中独一无二。

        【讨论】:

          【解决方案6】:

          Insert 语句将插入一条新记录。您不能将 where 子句应用于要插入的记录。

          where 子句可用于更新您想要的行。 更新 SET = where .

          但是 insert 不会有 where 子句。 希望这能回答你的问题

          【讨论】:

            【解决方案7】:

            INSERT 语法不能有 WHERE 子句。唯一一次你会发现 INSERT 有 WHERE 子句是当你使用 INSERT INTO...SELECT 语句时。

            【讨论】:

              【解决方案8】:

              我认为您包含的代码只是一个模板,用于显示您如何构建查询。请参阅 SO 问题 here, here 和 MSDN 问题 here.

              在 SQL Server(它使用 Transact-SQL aka T-SQL)中,您需要一个 UPDATE 查询 INSERT 其中列已经有值 - 通过使用答案 @HaveNoDisplayName 给出:)

              如果您从代码中执行INSERT / UPDATE(或者如果您经常需要它),我强烈建议您使用带参数的存储过程。

              您可以通过使用IF-ELSEINSERT 块添加到过程来进一步扩展过程,以确定是执行INSERT 新记录还是更新现有记录,如this SO 回答中所示。

              最后,看看SQLFiddle 的沙盒游乐场,以测试您的 SQL,而不会给您的 RDMS 带来风险 :-)

              【讨论】:

                【解决方案9】:

                我发现有用的私人案例:避免重复的条件插入:

                -- create a temporary table with desired values
                SELECT 'Peter' FirstName, 'Pan' LastName
                INTO #tmp
                    
                -- insert only if row doesn't exist    
                INSERT INTO Persons (FirstName, LastName)
                SELECT *
                FROM #tmp t
                WHERE NOT EXISTS (SELECT * FROM Persons where FirstName=t.FirstName and LastName=t.LastName)
                

                【讨论】:

                  【解决方案10】:

                  如果需要为现有行的列添加数据,则为UPDATE

                  INSERT 正在表格中创建新行。

                  对于条件INSERT,可以使用MERGE 命令。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-05-16
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-10-23
                    相关资源
                    最近更新 更多