#sql #compare
#sql #Сравнить
Вопрос:
Учитывая следующие таблицы, хранящиеся в базе данных SQL
Пользователь таблицы
id username phone
1 james 555-666-777
2 gabriel 666-555-777
3 Lucas 222-888-999
4 Marta 555-444-777
Таблица room_booking
id person_id room time
1 2 A2 13:00
2 4 B5 09:00
3 1 C1 20:00
Получая только room_booking id number 2
Я бы хотел, чтобы результат был:
Выходная таблица
id username phone
4 Marta 555-444-777
Я знаю INNER JOIN
, что могу выполнить эту работу, но я получил поля из таблицы room_booking
, включенной в SELECT *
комплект.
Ответ №1:
Как говорили другие, ответ заключается в том, чтобы не включать ненужные столбцы. Поскольку вам нужны все столбцы из одной таблицы и ни один из столбцов из другой таблицы, решением является использование person .*
Select distinct p.*
from person p
Inner join room_booking r
On r.person_id = p.id
Я включаю distinct, потому что, учитывая вашу структуру, в конечном итоге у вас, вероятно, будет более одного бронирования на человека.
Альтернативный синтаксис для достижения той же цели…
/*using sub select*/
Select * from person where id in (select person_id from room_booking);
/*using cte, distinct and inner join*/
; pids as(select distinct person_id from room_booking)
Select person.*
from pids
Inner join person on person_id = id;
/*using cte and subquery with explicit column list */
; pids as(select person_id from room_booking)
Select id, username, phone
from person
Where id in (select person_id from pids)
Комментарии:
1. Спасибо за ваш подробный ответ! Я, наконец, изменил структуру и использовал sub select в своем запросе. спасибо за четкую подсказку, которую я не знал.
Ответ №2:
select
p.id,
p.username,
p.phone
from Person p
inner join room_booking rb
on p.id = rb.person_id
where rb.id = 2
В качестве альтернативы вы можете выбрать p.*
, но вы не должны этого делать в коде prod.
Комментарии:
1. 1 для комментария select star. Ничто не нарушает код быстрее, чем звездочка выбора, при которой изменяется структура исходной таблицы. 🙂
2. Хорошо, спасибо вам обоим за информацию о p. * Я буду иметь в виду, что пока база данных продолжает расти. Спасибо!
Ответ №3:
Вы получаете все включенные поля, только если используете звездочку в запросе. Попробуйте выбрать только те поля, которые вы хотите получить:
SELECT person.id, username, phone
FROM person JOIN room_booking ON person.id = room_booking.person_id
WHERE room_booking.id = 2
Комментарии:
1. Спасибо за вашу помощь! хороший ввод с Where в конце. Я использовал person. * и я изменил структуру, как предложил jmoreno.
Ответ №4:
Я знаю, что ВНУТРЕННЕЕ СОЕДИНЕНИЕ может выполнить эту работу, но я включил поля из таблицы room_booking.
Не выбирайте их, и вы их не получите:
select p.id ,p.username ,p.phone from Person p
inner join room_booking rb
on rb.person_id=p.id
Ответ №5:
Обе возвращают один и тот же результат
======================1
SELECT C.CountryName,C.ZipCode,P.Population
FROM tbl_Country C, tbl_Population P
WHERE C.ID= P.ID
======================2
SELECT C.CountryName,C.ZipCode,P.Population
FROM tbl_Country C inner join tbl_Population P
on C.ID= P.ID