mysql: естественное соединение - PullRequest
2 голосов
/ 02 мая 2020

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

составляет таблицу названий кораблей, водоизмещений и чисел с участвующими в битве при Гуадалканале

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

3 таблицы необходимы для этого.

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

Мне также интересно, могу ли я использовать «естественное соединение» с избыточностью.

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

#1st trial
select distinct ship as name, displacement, numGuns
from Ships natural join Classes
natural join Outcomes
where battle = 'Guadalcanal';

#2nd trial
select distinct ship as Name
from Outcomes natural join Ships
where battle = 'Guadalcanal'
union
select displacement, numGuns
from Classes
where name = Name and ??

Я добавил запрос ввода данных для случая, когда он может вам понадобиться.

Большое спасибо заранее!

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 голос
/ 02 мая 2020

Вы хотите отобразить данные двух таблиц: ships и classes, они связаны 1: n, поэтому просто объедините их (inner join on / using). Тогда у вас есть условие, чтобы рассматривать только корабли, которые участвовали в конкретной битве. Условия в идеале WHERE. Мы ищем данные в других таблицах с помощью EXISTS или IN.

select s.name, c.numguns, c.displacement
from ships s
join classes c on c.class = s.class
where s.name in (select ship from outcomes where battle = 'Guadalcanal')
order by s.name;

. Помещая условие в предложение WHERE, мы избегаем дублирования. Что ж, в этом случае (только одна битва) мы не получим дубликатов, но рассмотрим более одной битвы. Объединение дало бы нам многократные корабли, так как объединение говорит: «дай мне корабли, объединенные с их битвами», в то время как IN и WHERE просто говорят «дай мне корабли, когда они участвовали хотя бы в одном из сражений» .

0 голосов
/ 02 мая 2020

Я думаю, что это поможет вам:

SELECT Ships.name, Classes.displacement, Classes.numGuns 
FROM Ships 
INNER JOIN Classes ON Ships.Class = Classes.Class
INNER JOIN Outcomes ON Outcomes.Ship = Ships.Name
WHERE Outcomes.battle = 'Guadalcanal';

Если вам нужна помощь, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...