SQL сравнивает две таблицы с общим идентификатором

#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