【问题标题】:How can I update a table based on results from a select query?如何根据选择查询的结果更新表?
【发布时间】:2013-10-24 16:13:59
【问题描述】:

假设我想更新表course_main。我最初的查询是:

update course_main
set data_src_pk1 = 2
where course_id LIKE '%FA2013' and available_ind = 'N'

这会得到一些我不想更新的课程(幸运的是只有一小部分)。所以我有一个 select 语句来检索我想要更新的实际数据,它返回 145 行。

select course_id from course_main
where course_id like '%FA2013' and available_ind = 'N'
and course_id <> 'ENGL-0330-112WE-FA2013'
and course_id <> 'ENGL-0360-112WE-FA2013' 
and course_id <> 'ENGL-0390-112WE-FA2013'
and course_id <> 'ARTC-1053-128HY-CEQ113'
and course_id <> 'ARTC-1353-128HY-FA2013'
and course_id <> 'HITT-1005-005IN-CEQ113'
and course_id <> 'HITT-1305-005IN-FA2013'
and course_id <> 'HITT-1305-006IN-FA2013'
and course_id <> 'READ-0300-104WE-FA2013'
and course_id <> 'READ-0340-104WE-FA2013'
and course_id <> 'READ-0370-104WE-FA2013'
and course_id <> 'WBCT-1003-011IN-FA2013'
and course_id <> 'WBCT-1005-011IN-CEQ113'
and course_id <> 'WBCT-1003-010IN-FA2013'
and course_id <> 'WBCT-1005-010IN-CEQ113'
and course_id <> 'ARTS-1301-012IN-FA2013'
order by course_id asc

我想使用更新语句仅命中第二个查询的 145 个结果。有关如何完成此操作的任何指示?

谢谢。

【问题讨论】:

  • 注意LIKE '%...'不能使用索引。

标签: mysql sql sql-server sql-server-2008


【解决方案1】:

我认为你过于复杂了。

update course_main
set data_src_pk1 = 2
where course_id like '%FA2013' and available_ind = 'N'
and course_id <> 'ENGL-0330-112WE-FA2013'
and course_id <> 'ENGL-0360-112WE-FA2013' 
and course_id <> 'ENGL-0390-112WE-FA2013'
and course_id <> 'ARTC-1053-128HY-CEQ113'
and course_id <> 'ARTC-1353-128HY-FA2013'
and course_id <> 'HITT-1005-005IN-CEQ113'
and course_id <> 'HITT-1305-005IN-FA2013'
and course_id <> 'HITT-1305-006IN-FA2013'
and course_id <> 'READ-0300-104WE-FA2013'
and course_id <> 'READ-0340-104WE-FA2013'
and course_id <> 'READ-0370-104WE-FA2013'
and course_id <> 'WBCT-1003-011IN-FA2013'
and course_id <> 'WBCT-1005-011IN-CEQ113'
and course_id <> 'WBCT-1003-010IN-FA2013'
and course_id <> 'WBCT-1005-010IN-CEQ113'
and course_id <> 'ARTS-1301-012IN-FA2013'

【讨论】:

    【解决方案2】:
    update course_main
    set data_src_pk1 = 2
    where course_id in (select course_id from course_main
    where course_id like '%FA2013' and available_ind = 'N'
    and course_id <> 'ENGL-0330-112WE-FA2013'
    and course_id <> 'ENGL-0360-112WE-FA2013' 
    and course_id <> 'ENGL-0390-112WE-FA2013'
    and course_id <> 'ARTC-1053-128HY-CEQ113'
    and course_id <> 'ARTC-1353-128HY-FA2013'
    and course_id <> 'HITT-1005-005IN-CEQ113'
    and course_id <> 'HITT-1305-005IN-FA2013'
    and course_id <> 'HITT-1305-006IN-FA2013'
    and course_id <> 'READ-0300-104WE-FA2013'
    and course_id <> 'READ-0340-104WE-FA2013'
    and course_id <> 'READ-0370-104WE-FA2013'
    and course_id <> 'WBCT-1003-011IN-FA2013'
    and course_id <> 'WBCT-1005-011IN-CEQ113'
    and course_id <> 'WBCT-1003-010IN-FA2013'
    and course_id <> 'WBCT-1005-010IN-CEQ113'
    and course_id <> 'ARTS-1301-012IN-FA2013') 
    

    ?

    【讨论】:

    • 这有帮助,谢谢。我知道我“过于复杂”了,但这就是我要寻找的,“WHERE IN”子句的一个例子。
    • 您不需要子选择。这也很复杂。可以进一步简化如my answer below
    • 我认为他正在寻找一种方法来借助选择中的键来更新行。我进一步认为他的更新只是作为他的问题的一个例子。
    【解决方案3】:

    怎么样

    UPDATE course_main
    SET data_src_pk1 = 2
    WHERE course_id LIKE '%FA2013' 
       AND available_ind = 'N'
       AND course_id NOT IN ('ENGL-0330-112WE-FA2013','ENGL-0360-112WE-FA2013',.....)
     ORDER BY course_id ASC;
    

    ?

    【讨论】:

    • 这有帮助,谢谢。我知道我“过于复杂”了,但这就是我要寻找的,“WHERE IN”子句的一个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多