mysql - mysql更新条件:失败
问题描述
我目前正在尝试使用满足以下条件的 MySQL 制作一个简单的表。
如果船是内置的“日本”,则将结果数据的结果更新为“沉没”
我尝试了几个代码,但都失败了。
这是我一直在尝试的代码
update Outcomes
set result = 'sunk'
where ship = (
select name
from Ships
natural join Classes as A
where Classes.country = 'Japan'
and Outcomes.ship = A.name
);
我为您可能需要的情况添加了数据输入查询。
create table Classes(
Class varchar(20),
type char(20),
country varchar(20),
numGuns int,
bore int,
displacement int,
primary key(Class)
);
create table Ships(
name varchar(20),
Class varchar(20),
launched int,
primary key(name),
foreign key(Class) references Classes (Class)
);
create table Outcomes(
ship varchar(20),
battle varchar(20),
result varchar(10),
foreign key(battle) references Battles(Name),
foreign key(ship) references Ships(name)
);
insert into Classes values
('Bismark', 'bb', 'Germany', 8, 15, 42000),
('Iowa', 'bb', 'USA', 9, 16, 46000),
('Kongo', 'bc', 'Japan', 8, 14, 32000),
('North Carolina', 'bb', 'USA', 9, 16, 37000),
('Renown', 'bc', 'Gt. Britain', 6, 15, 32000),
('Revenge', 'bb', 'Gt. Britain', 8,15, 29000),
('Tennessee', 'bb', 'USA', 12, 14, 32000),
('Yamato', 'bb', 'Japan', 9, 18, 65000);
insert into Ships values
('Prince of Wales', 'Tennessee', 1921),
('Bismark', 'Bismark', 1915),
('Duke of York', 'Kongo', 1914),
('Iowa', 'Iowa', 1943),
('Kirishima', 'Kongo', 1915),
('Kongo', 'Kongo', 1913),
('Fuso', 'Iowa', 1943),
('Yamashiro', 'Yamato', 1942),
('California', 'Iowa', 1943),
('North Carolina', 'North Carolina', 1941),
('Renown', 'Renown', 1916),
('Hood', 'Renown', 1916),
('Scharnhorst', 'Revenge', 1916),
('Revenge', 'Revenge', 1916),
('King George V', 'Revenge', 1916),
('South Dakota', 'Revenge', 1916),
('Tennessee', 'Tennessee', 1920),
('Washington', 'North Carolina', 1941),
('West Virginia', 'Iowa', 1943),
('Yamato', 'Yamato', 1941);
insert into Outcomes values
('Bismark', 'North Atlantic', 'sunk'),
('California', 'Surigao Strait', 'ok'),
('Duke of York', 'North Cape', 'ok'),
('Duke of York', 'Surigao Strait', 'ok'),
('Fuso', 'Surigao Strait', 'sunk'),
('Hood', 'North Atlantic', 'sunk'),
('King George V', 'North Atlantic', 'ok'),
('Kirishima', 'Guadalcanal', 'sunk'),
('Prince of Wales', 'North Atlantic', 'damaged'),
('Prince of Wales', 'North Cape', 'ok'),
('Scharnhorst', 'North Cape', 'sunk'),
('South Dakota', 'Guadalcanal', 'damaged'),
('Tennessee', 'Surigao Strait', 'sunk'),
('Washington', 'Guadalcanal', 'ok'),
('West Virginia', 'Surigao Strait', 'ok'),
('Yamashiro', 'Surigao Strait', 'ok');
解决方案
您可以尝试加入更新:
update Outcomes
join Ships
on Outcomes.ship = Ships.name
join Classes
on Classes.class = Ships.class
set Outcomes.result = 'sunk'
where Classes.country = 'Japan'
我看到你的错误是你加入and Outcomes.ship = A.name
而不是and Ships.class = A.name
(A
作为别名Classes
)。Classes
此外,尽管您给它起了别名 ( ),但您还是通过它的实际名称 ( Classes
)来引用您的表A
。据我所知,这是不允许的:
update Outcomes
set result = 'sunk'
where ship = (
select name
from Ships
natural join Classes as A
where Classes.country = 'Japan' <<< Here you refer to Classes instead of A
and Outcomes.ship = A.name <<< This doesn't make sense to me
);
推荐阅读
- java - 来自网站的内容不会显示在我的 logcat 中
- postgresql - postgres 容器创建数据库但不创建表和添加数据
- jenkins - 无法从詹金斯控制台输出文件中获取值
- javascript - React-Hooks-如何使用 FlatList 为 renderItem 中的每个渲染项分配一个唯一的“ref”?
- javascript - 为什么 jQuery 项目不能在 Github 页面上运行?
- vue.js - 如何设置存储数据以检查 vuejs 中路由中的守卫?
- php - 使用来自 laravel 的浏览器会话执行 wkhtmltopdf
- ios - 如何解决颤振项目中的脚手架错误?
- php - 从 Prestashop API (SimpleXMLElement) 读取 XML
- vaadin14 - 如何将vaadin的标签标记放在顶部?