Mysql 复杂更新查询
表1 表2 我正试图用第二张表中蓝色汽车的汽车id更新Alex的汽车id。可以在一个查询中完成吗 我尝试在下面编写查询,但无法使其工作。有什么想法吗Mysql 复杂更新查询,mysql,sql,Mysql,Sql,表1 表2 我正试图用第二张表中蓝色汽车的汽车id更新Alex的汽车id。可以在一个查询中完成吗 我尝试在下面编写查询,但无法使其工作。有什么想法吗 UPDATE table1 SET table1.car_id = table2.car_id FROM table1 JOIN table2 ON table2.color = "blue" WHERE table1.name = "Alex" 预期结果: 我怀疑它在一个查询中不起作用。[编辑:错误,请参阅其他答案]
UPDATE table1
SET table1.car_id = table2.car_id
FROM table1
JOIN table2
ON table2.color = "blue"
WHERE table1.name = "Alex"
预期结果:
我怀疑它在一个查询中不起作用。[编辑:错误,请参阅其他答案] 对于没有公共列的两个不同表,您有两种不同的要求。 您需要独立于Alexes row查找蓝色汽车id,因为它们现在没有任何链接 我会这样做: UPDATE table1 SET table.car_id = ( SELECT car_id FROM table2 WHERE color LIKE 'blue' ) WHERE name LIKE 'Alex'
更新secondTable上的firstTable join secondTable.color='blue'设置firstTable.car\u id=secondTable.car\u id,其中firstTable.car\u id为空 我有一个类似问题的解决方案,就是人多车多。 也许会有帮助 基本数据选项卡如下所示
CREATE TABLE Table1
(`id` int, `name` varchar(4), `address` varchar(7), `car_id` varchar(4))
;
INSERT INTO Table1
(`id`, `name`, `address`, `car_id`)
VALUES
(1, 'Alex', 'US', NULL),
(2, 'Jaso', 'Canad a', '1'),
(3, 'Paso', 'Canad a', NULL),
(4, 'Paso', 'danad a', NULL)
;
CREATE TABLE Table2
(`car_id` int, `color` varchar(7))
;
INSERT INTO Table2
(`car_id`, `color`)
VALUES
(1, 'red'),
(2, 'blue'),
(3, 'green') ,
(4, 'purple')
;
mysql 5.7之前的sql语句
Update Table1 t1a inner Join
(Select tab1.id, tab2.car_id From
( Select
`id`,
@curRank := @curRank + 1 AS rank
FROM Table1, (SELECT @curRank := 0) r
WHERE car_id IS NULL ) tab1
inner join
( Select
car_id,
@curRank2 := @curRank2 + 1 AS rank
From Table2 , (SELECT @curRank2 := 0) r Where car_id NOT IN
(
Select Car_id From
(Select GROUP_CONCAT(t1.car_id) car_id FROM Table1 as t1) t1e
WHERE car_id IS NOT NULL GROUP BY car_id
)
) tab2
ON tab1.rank = tab2.rank) t2a
on t1a.id = t2a.id
SET t1a.car_id = t2a.car_ID
;
我们在这里面临的问题是,实际上我们需要表taht中的车辆ID已经被取下。然后仅选择尚未选择的车辆id的其余部分。
之后,我们必须作出声明,使任何人都能得到一种颜色,即每种颜色只被选择一次。这需要一些代码,因为我们在tabel1 car_id thta为NULL和table2之间没有关系
所以结果是
id name address car_id
1 Alex US 2
2 Jaso Canad a 1
3 Paso Canad a 3
4 Paso danad a 4
mysql 8使用的是窗口功能,而不是车辆等级。我怀疑你错了,是的。但是oneliner解决方案比Nessery更复杂,没有性能优势。在t2.color='blue'集合t1.car\u id=t2.car\u id上更新t1 JOIN t2,其中t1.car\u id为NULL;是的,草莓的解决方案奏效了!非常感谢。你应该把它作为答案贴出来,这样我就可以选择它作为答案了!太琐碎了,您的查询似乎适合sql server-mysql语法与读取多表语法不同:
CREATE TABLE Table1
(`id` int, `name` varchar(4), `address` varchar(7), `car_id` varchar(4))
;
INSERT INTO Table1
(`id`, `name`, `address`, `car_id`)
VALUES
(1, 'Alex', 'US', NULL),
(2, 'Jaso', 'Canad a', '1'),
(3, 'Paso', 'Canad a', NULL),
(4, 'Paso', 'danad a', NULL)
;
CREATE TABLE Table2
(`car_id` int, `color` varchar(7))
;
INSERT INTO Table2
(`car_id`, `color`)
VALUES
(1, 'red'),
(2, 'blue'),
(3, 'green') ,
(4, 'purple')
;
Update Table1 t1a inner Join
(Select tab1.id, tab2.car_id From
( Select
`id`,
@curRank := @curRank + 1 AS rank
FROM Table1, (SELECT @curRank := 0) r
WHERE car_id IS NULL ) tab1
inner join
( Select
car_id,
@curRank2 := @curRank2 + 1 AS rank
From Table2 , (SELECT @curRank2 := 0) r Where car_id NOT IN
(
Select Car_id From
(Select GROUP_CONCAT(t1.car_id) car_id FROM Table1 as t1) t1e
WHERE car_id IS NOT NULL GROUP BY car_id
)
) tab2
ON tab1.rank = tab2.rank) t2a
on t1a.id = t2a.id
SET t1a.car_id = t2a.car_ID
;
id name address car_id
1 Alex US 2
2 Jaso Canad a 1
3 Paso Canad a 3
4 Paso danad a 4