У меня есть две таблицы а, б.
Таблица table1
состоит из 5 столбцов:
primary key AS pkid
table2_primary-key AS id1
table2_primary-key AS id2
rating
date
Таблица table2
состоит из 2 столбцов:
primary key AS pkid
name
Я хочу присоединить table1 к table2 и отобразить первичный ключ, рейтинг и дату из table1, а также имена, соответствующие table1.id1
и table1.id2
.
Для этого я написал следующий запрос
Select
a.pkid
, b.name
, c.name
, a.rating
, a.date
FROM table1 a, table2 b, table2 c
WHERE a.id1=b.pkid and a.id2=c.pkid;
Есть ли лучший способ написать этот запрос?
Добро пожаловать в Stack Overflow! Вы обнаружите, что у вас будет больше впечатлений, если вы выберете момент, чтобы взять Обзор переполнения стека. Вы также можете прочитать о том, как задать хороший вопрос. Если вы следуете нормам сообщества Stack Overflow и подходите к нему так, чтобы помогать другим, это сослужит вам хорошую службу.
Я думаю, что ваш запрос по сути хорош. Я бы улучшил два аспекта:
Измененная версия вашего запроса будет выглядеть так:
select
a.pkid, b.name,
case when c.name is null then 'system' else c.name end,
a.rating, a.date
from table1 a
left join table2 b on a.id1 = b.pkid
left join table2 c on a.id2 = c.pkid
Да table1 id1 не оплачивается, но id2 несколько раз ноль в это время Я хочу отображаемое имя как системное
@Ramya, это довольно важная часть бизнес-логики, которую вы не упомянули.
@Ramya В соответствии с просьбой, я добавил предложение CASE
для преобразования пустого id2-name в 'system',
Спасибо, это работает
Вам всегда понадобятся два соединения (поскольку id1 и id2 разные) ...
Однако я бы использовал явное соединение вместо запятой. Как таковой
SELECT A.PKID, B.NAME, C.NAME, A.RATING, A.NAME
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.ID1=B.PKID
LEFT JOIN TABLE2 C ON A.ID2=C.PKID;
Что ж ... у вас есть внешние ключи два, поэтому вам нужны соединения два.