我有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`))
问题是:为项目中的每位员工提供薪水。
答案 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
你说你希望项目中的每个员工都有薪水。架构表明员工不在项目上,而是部门的一部分,而部门在项目上。我假设如果部门在一个项目上,那么部门的员工都在项目上。
您的更新查询为每个人提供与任何项目相同的薪水,如下所示:
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>