Postgres несколько соединений - PullRequest
24 голосов
/ 08 января 2012

Это postgres db. Я пытаюсь извлечь названия пород собак (Кане Корсо, Лабрадор и т. Д.) Из таблицы пород, чтобы отобразить их на основе внешних ключей, расположенных в таблице животных. Моя проблема в том, что у таблицы животных есть два внешних ключа к этой таблице, и я продолжаю получать ошибки в своем запросе. Имя первой породы будет возвращено в зависимости от левого соединения, но во-вторых, я не могу отобразить имя, так как у меня уже есть левое соединение. Ниже приведен упрощенный план того, что я пытаюсь сделать:

breed table (ID, BreedName)
animal table (ID, breedID, breed2ID)

SELECT animal.ID, breed.BreedName FROM animal LEFT JOIN breed ON animal.breedID=breed.ID WHERE animal.ID='7';

Что мне нужно сделать, так это заставить BreedName присоединиться к animal.breed2ID, к которому я с треском проваливаюсь. Я мог бы легко жестко кодировать названия пород и отображать их в приложении, но это не способствует изменениям, добавлениям или удалению названий пород в базе данных.

Ответы [ 2 ]

51 голосов
/ 08 января 2012

просто сделайте еще одно соединение на той же таблице:

SELECT animal.ID, breed1.BreedName as BreedName1, breed2.BreadName as BreadName2 
FROM animal 
   LEFT JOIN breed as breed1 ON animal.breedID=breed1.ID 
   LEFT JOIN breed as breed2 ON animal.breedID=breed2.ID 
WHERE animal.ID='7';
20 голосов
/ 09 января 2012

Хотя Иван решил вашу проблему для вашего текущего дизайна базы данных, долгосрочное рассмотрение или просто урок должны были бы сделать вашу таблицу более нормализованной так, чтобы добавление нового объединения происходило каждый раз, когда вы хотите добавить породу.животному не нужно.Благодаря этой простой конструкции вы фактически усложнили свою жизнь.

Когда вы видите повторяющиеся типы свойств на объекте, в вашем случае breedID и breed2ID вы обычно начинаете ощущать что-то гнилое во всех, кроме очень редких случаев.чехлы.

При идеальном дизайне вы будете делать следующее.

1. Сохраните вашу породу как есть.

2. Сделайте животное похожим на животное (animal_id, animal_name).

3. Добавьте новую таблицу animal_breed.Это будет выглядеть так: animal_breed (animal_breed_id, animal_id, breed_id).С animal_bread_id - это pk и уникальный ключ (animal_id, breed_id) с внешними ключами, указывающими обратно на соответствующие таблицы.

Этот дизайн позволяет данному животному принимать один или несколько типов породы без необходимости когда-либовозиться с вашим запросом, чтобы вернуть несколько пород обратно.Ваш текущий дизайн становится кошмаром каждый раз, когда у вас появляется лишняя порода животных.У него есть потенциал, чтобы снизить производительность и сделать техническое обслуживание кошмаром, и к тому же это просто не продуманный дизайн базы данных.

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