如何使用同一个表

时间:2017-06-02 10:52:41

标签: mysql sql

我想从表中更新一列,我想要输入的数据是使用引用更新表的subquerys进行数学运算的结果。

问题是我想使用上述数学运算中同一行的数据更新每一行。

以下是示例:


    UPDATE licenses as lic
    SET lic.numSessions = 
    (
    select difference from
    (select
    (
    select (p.numSessions * p.numMonth) as num from products p
    inner join licenses l on p.idProduct = l.idProduct and l.idpatient = lic.idPatient and l.currentLicense = 1
    )
    -
    (
    SELECT COUNT(distinct s.idSession) as num
    FROM sessions s 
    WHERE s.idPatient = lic.idPatient
    AND s.dateValue >= (select l.dateCreated from licenses l where l.idPatient = lic.idPatient and l.currentLicense = 1) AND s.status = 2
    )
    as difference   
    ) 
    x
    );

编辑:

我想要的例子:

'license'的每一行都有一个'idPatient'。我们称之为'X'。

我想看看X已经完成了多少次会话(例如10次),然后从'X''产品的会话总数中减去这个数字(例如50)。因此,X更新的结果将是:50 - 10 = 40。

子查询单独工作,我的值为50,然后值为10,然后当我尝试减去时,我将值40作为名为“差异”的列。

我遇到的问题是查询无法识别substract操作中第一个子查询中的值'lic.idPatient':


    /* SQL Error (1054): Unknown column 'lic.idPatient' in 'on clause' */

提前致谢并对我的写作感到抱歉,我不是英国人。

1 个答案:

答案 0 :(得分:0)

你必须写这样的查询

UPDATE licenses AS licNew
    SET licNew.numSessions = 
    (
    SELECT x.difference FROM
    ((SELECT
    (
    SELECT (p.numSessions * p.numMonth) AS num FROM products p
    INNER JOIN licenses l ON p.idProduct = l.idProduct AND l.idpatient = lic.idPatient AND l.currentLicense = 1
    )
    -
    (
    SELECT COUNT(DISTINCT s.idSession) AS num
    FROM sessions s 
    WHERE s.idPatient = 6361
    AND s.dateValue >= (SELECT l.dateCreated FROM licenses l WHERE l.idPatient = 6361 AND l.currentLicense = 1) AND s.status = 2
    ))
    AS difference, lic.idPatient
    FROM licenses lic
    ) 
    X WHERE licNew.idPatient = x.idPatient
    );

通常,您无法修改表并从子查询中的同一个表中进行选择。

请参阅此link