【问题标题】:How can I combine all this into one SQL UPDATE query?如何将所有这些组合到一个 SQL UPDATE 查询中?
【发布时间】:2011-03-24 05:11:25
【问题描述】:

如果可能的话,我会尝试将所有这些组合到一个查询中。我正在使用 SQLLite,所以我没有可用的存储过程。

查询的简单版本如下所示:

UPDATE FoodIntake SET MealType = 'B' WHERE Time < LunchStrt AND Time > BreakfastStart

但是必须推导出时间:

SET Time = RIGHT(DateTime, 8)

并且必须根据从程序传递的参数从 Patient 表中引入LunchStart 和BreakfastStart。像这样:

SELECT LunchStrt FROM Patient WHERE PatientId = :currentPatient AS LunchStrt
SELECT BrkStrt FROM Patient WHERE PatientId = :currentPatient AS BrkStrt

我想我终于可以将 Time 换成 RIGHT(DateTime, 8):

UPDATE FoodIntake SET MealType = 'B' WHERE RIGHT(DateTime, 8) < LunchStrt AND RIGHT(DateTime, 8) > BreakfastStart

但如果可能的话,我不确定从更新中的 Patient 表中引入 LunchStrt 和 BrkStrt 的正确语法。

【问题讨论】:

    标签: sql sqlite variables join sql-update


    【解决方案1】:

    一些注意事项:

    • SQLite 没有RIGHT 函数,但您可以使用substr 函数并传递一个负的起始位置。
    • SQLite 确实支持BETWEEN ... AND ... 三元运算符,所以你可以写WHERE substr(DateTime, -8) BETWEEN BreakfastStart AND LunchStrt
    • SQLite 还支持 scalar subqueries,因此您可以使用它们来检索您要查找的特定值

    结合这三个选项,你可以这样写:

    UPDATE FoodIntake 
       SET MealType = 'B' 
     WHERE substr(Time, -8) 
            BETWEEN (SELECT BrkStrt FROM Patient WHERE PatientId = :currentPatient)
                AND (SELECT LunchStrt FROM Patient WHERE PatientId = :currentPatient)
    

    【讨论】:

    • 太棒了!我只需要将 Time 更改为 DateTime 就可以了!我最近从另一篇文章中得到的印象是,我需要一个 CASE 语句来进行多次更新,但很高兴事实并非如此。一个快速的问题.. 如果我想在更复杂的查询中的其他地方使用 BrkStrt,有没有办法将它设置为查询中的变量?
    • 不,SQL 不知道变量的概念。但是,您可以重复该声明;大多数 SQL 解析器会识别出它是相同的值,并在不运行两次查询的情况下重复使用它(SQLite 至少会这样做)。
    猜你喜欢
    • 2015-10-08
    • 2012-08-14
    • 1970-01-01
    • 2011-01-23
    • 2017-03-13
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多