mysql обновление с условием: не удалось - PullRequest
0 голосов
/ 03 мая 2020

В настоящее время я пытаюсь создать простую таблицу с MySQL, которая удовлетворяет следующему условию.

обновить результат данных Outcomes на «потопленный», если корабль был встроен в «Японию»

enter image description here enter image description here enter image description here

Я пробовал несколько кодов, но все они не удалось.

Вот код, который я пробовал

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');

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Правильное ОБНОВЛЕНИЕ должно быть: Название корабля происходит от кораблей, а не от классов.

update Outcomes
        set result = 'sunk' 
    where ship = (
                    select name 
                    from Ships B
                        natural join Classes as A 
                    where A.country = 'Japan' 
                    and Outcomes.ship =  B.name
                );

См. Пример https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=999573123e2a739389e40108dca130a5

1 голос
/ 03 мая 2020

Вы можете попробовать объединенное обновление:

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.nameA в качестве псевдонима для 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
            );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...