Обычно я работаю с Ruby on Rails и записываю большинство своих запросов в DB через интерфейс интерфейса Ruby.MS SQL Server: сложный запрос JOIN между несколькими таблицами
На этот раз, однако, на самом деле я создаю представление БД и должен сам написать сам SQL, чтобы это мнение можно было запросить (работая с системой Legacy).
Я попытался сделать эти примеры проще, чем система, но все же решить конкретную проблему.
В псевдокоде, вот отношения:
parents has_many children belongs_to parents
children has_many pets belongs_to children
pets belongs_to pet_types
pet_types has_many pets
Это достигается с помощью стандартных foreign_key отношений (т.е. children
таблица имеетa parent_id
).
Цель
То, что я пытаюсь выполнить список всех родителей и последнего ребенка (через created_at
) последний домашний кот (через created_at
). Если у parent
нет детей, null
оставим все поля.
Моя попытка SQL была в основном связкой LEFT OUTER JOINs
, которая не фильтруется должным образом.
-------------------------------------------------------------
| id | parent_name | child_name | pet_name | pet_type_value |
-------------------------------------------------------------
| 1 | Bob | Jeremy | Wildfire | cat |
-------------------------------------------------------------
...more records...
Столы
parents
--------------------------
| id | name | created_at |
--------------------------
| 1 | Bob | 2014-10... |
| 2 | John | 2014-10... |
| 3 | Suzy | 2014-10... |
--------------------------
children
----------------------------------------
| id | parent_id | name | created_at |
----------------------------------------
| 1 | 1 | Jeremy | 2014-10... |
| 2 | 1 | Katy | 2014-10... |
| 3 | 2 | Garet | 2014-10... |
----------------------------------------
pets
-------------------------------------------------------
| id | child_id | name | pet_type_id | created_at |
-------------------------------------------------------
| 1 | 1 | Wildfire | 1 | 2014-10... |
| 2 | 1 | Ninja | 1 | 2014-10... |
| 3 | 2 | Grumpy | 2 | 2014-10... |
-------------------------------------------------------
pet_types
--------------
| id | value |
--------------
| 1 | cat |
| 2 | dog |
--------------
Оригинал ПОПЫТКА
Вот что я первоначально придумал, что не получилось ... Я не разработчик SQL/кодировщик, а вы, очевидно, можете сказать. Обратите внимание, что я очистил его немного из исходных таблиц/столбцов и превратили его в иллюстративных таблиц:
SELECT
parents.id as id,
parents.name as name,
parents.created_at as created_at,
pet_types.value as pet_type_value,
children.id as child_id,
children.name as child_name
FROM
parents
LEFT OUTER JOIN (
SELECT
pet_types.value as pet_type_value,
children.parent_id as parent_id
FROM children
LEFT OUTER JOIN pets
ON pets.child_id = children.id
LEFT OUTER JOIN pet_types
ON (
pets.pet_type_id = pet_types.id
AND pet_types.name = 'cat'
)
) AS children
ON (children.parent_id = parents.id)
WHERE
children.parent_id = parents.id
ORDER BY parents.id
Вы можете редактировать, опубликовать SQL попытку, которая не работала, и то, что было неправильно с результатами? –
@TabAlleman, конечно. Мне нужно сначала очистить его от информации о компании, а затем обновить публикацию. –