UPDATE table1.argument1基于table3.argument3的值

时间:2014-10-09 02:14:17

标签: mysql sql

我有3张桌子:

table1 使用key1连接到 table2

table2 使用key2连接到 table3

所以table2有2个外键。一个用于连接到table1。第二个用于连接到table3。

我需要根据 table3.argument3

的值更新 table1.argument1

我试过了:

UPDATE table1
SET table1.argument1 = <NEW_VALUE>
WHERE
   (SELECT table3.argument3 
   FROM table1 LEFT JOIN table3 ON table1.key1=table3.key3) = <SOME_VALUE>;

它给了我一个错误。 我认为我的错误在于避免使用table2。有没有更简单的方法? 还有一种避免子查询的方法吗?

更新


我想我误解了这个问题。 请参阅下面的架构(我删除了所有不必要的entires)

CREATE TABLE IF NOT EXISTS `company`.`employee` (
`ssn` CHAR(9) NOT NULL DEFAULT '',
`salary` DECIMAL(10,2) NULL DEFAULT NULL,
`dno` BIGINT NULL,
 PRIMARY KEY (`ssn`),
 INDEX `dno` (`dno` ASC),
 CONSTRAINT `employee_ibfk_2`
 FOREIGN KEY (`dno`)
 **REFERENCES `company`.`department` (`dnumber`),**

  CREATE TABLE IF NOT EXISTS `company`.`department` (
 `dnumber` BIGINT NOT NULL DEFAULT '0',
 `mgrssn` CHAR(9) NOT NULL,
  PRIMARY KEY (`dnumber`),
  INDEX `mgrssn` (`mgrssn` ASC),`
  FOREIGN KEY (`mgrssn`)
  **REFERENCES `company`.`employee` (`ssn`))**
  ENGINE = InnoDB
  DEFAULT CHARACTER SET = utf8;

  CREATE TABLE IF NOT EXISTS `company`.`project` (
  `pnumber` BIGINT NOT NULL DEFAULT '0',
  `dnum` BIGINT NOT NULL,
   INDEX `dnum` (`dnum` ASC),`
   FOREIGN KEY (`dnum`)
   REFERENCES `company`.`department` (`dnumber`))

问题是:为项目中的每位员工提供薪水。

2 个答案:

答案 0 :(得分:0)

“我需要根据table3.argument3的值更新table1.argument1”

您需要选择table3.argument。

,而不是选择table1.argument

我能想到的最好的就是你需要先选择并获取table2.key2。

试试这个:

SELECT table2.key1 AS KEY_VALUE
       FROM table3 JOIN table2 on table2.key2 = table3.key2 where table3.argument = <SOME_VALUE>

UPDATE table1
SET table1.argument = <NEW_VALUE>
WHERE
  table1.key1 = <KEY_VALUE>

从你的例子:

SELECT table2.SCHOOL_ID AS KEY_VALUE
           FROM table3 JOIN table2 on table2.PROJECT_ID = table3.PROJECT_ID where table3.PROJECT_NAME = <SOME_VALUE>

UPDATE table1
    SET table1.GRADE = <NEW_VALUE>
    WHERE
       SCHOOL_ID = <KEY_VALUE>

答案 1 :(得分:0)

我相信你的陈述都是倒退的。在mysql中,使用另一个表中的条件的UPDATE采用以下形式:

UPDATE
FROM <table>
INNER JOIN <table2>
    ON <table>.<field> = <table2>.<field>
SET <table>.<field2> = <some value>
WHERE <table2>.<somefield> = something...

在您的情况下假设您可以直接加入T1到T3(您建议您不应该但我无法验证您的架构):

UPDATE 
FROM table1
    LEFT JOIN table3 ON
        table1.key1 = table3.key3
SET table1.argument1 = <?>
WHERE table3.argument3 = <?>

如果你只是想把table1&quot;的argument1值设置为table3&#39;的argument3值,那么键匹配:

UPDATE 
FROM table1
    LEFT JOIN table3 ON
        table1.key1 = table3.key3
SET table1.argument1 = table3.argument3

已更新以匹配OP问题

的更新

你说你希望项目中的每个员工都有薪水。架构表明员工不在项目上,而是部门的一部分,而部门在项目上。我假设如果部门在一个项目上,那么部门的员工都在项目上。

您的更新查询为每个人提供与任何项目相同的薪水,如下所示:

UPDATE 
FROM employee
    LEFT JOIN project ON
        employee.dno = project.dnum
SET employee.salary = <whatever salary>
WHERE project.dnum IS NOT NULL

您的更新查询为人们提供与特定项目相同的薪水:

UPDATE 
FROM employee
    INNER JOIN project ON
        employee.dno = project.dnum
SET employee.salary = <whatever salary>
WHERE project.pnumber = <your project ID>