2016-12-12 4 views
1

У меня есть следующий код, который дает нужный мне результат:(SQL) Несколько соединений на одном столе - более оптимизированный способ?

SELECT p.name, 
     p.hobby1_id, h.code, h.description, 
     p.hobby2_id, h2.code, h2.description 
     p.hobby3_id, h3.code, h3.description 
FROM person p 
     LEFT JOIN hobby h ON h.id = p.hobby1_id 
     LEFT JOIN hobby h2 ON h2.id = p.hobby2_id 
     LEFT JOIN hobby h3 ON h3.id = p.hobby3_id 

Есть ли более оптимизированный способ это? По возможности, избавиться от h2 и h3. Спасибо

+1

Покажите нам некоторые данные таблицы образцов и ожидаемый результат. – jarlh

+0

Покажите, пожалуйста, каков смысл запроса. Маленький общий намек. Обычно левые соединения менее эффективны, чем «классические» внутренние соединения. Поэтому вы можете заменить их (или один из них) в том случае, если вы уверены, что hobby2 или hobby3 всегда не являются нулевыми. – Massimo

+0

Есть ли способ форматирования текста здесь, как таблица, о которой я не знаю? У меня проблемы с вкладками и пробелами O_O спасибо – AwonDanag

ответ

1

Проблема, кажется, дизайн. Как видно, ваша таблица person имеет три столбца с FKs для таблицы hobby (hobby1_id to hobby3_id).

С этим (плохим) дизайном нет лучшего способа ...

Но есть лучшая структура:

table person 
- personID 
- name 
- more columns to store further details for one specific person 

table hobby 
- hobbyID 
- hobby 
- more columns to store further details for this specific hobby 

table person_hobby 
- personID 
- hobbyID 
- Rank (if needed) 
- more columns to specify details of this special mapping 

Это классический n:m relation

Таблица person_hobby определяет сопоставление между людьми и хобби. При необходимости вы можете добавить столбец Rank, чтобы установить «первое» увлечение «вторым» и «третьим». Вы могли бы применять правила, чтобы ограничить это до трех, но зачем это нужно ...

+0

Так что более рекомендуется изолировать хобби? Потому что нужны три столбца 'id' для хобби в таблице' person'. – AwonDanag

+0

Что нужно * три столбца id для хобби в таблице персонажа требуются * означают? Это ужасно плохой дизайн ... При необходимости в качестве * таблицы * вы можете ввести 'VIEW' и включить первые три увлечения через' PIVOT' ... – Shnugo

+0

Я действительно готовлю этот запрос для 'VIEW' .. В любом случае таблица 'person' имеет столбцы' hobby1_id', 'hobby2_id' и т. д. Я думал, что добавление этих трех в таблицу было бы тривиальным, чем добавление другой таблицы 'person_hobby', как вы предполагали, что означало бы более длинные запросы ... – AwonDanag

Смежные вопросы