Как объединить записи из нескольких таблиц объектов в главную таблицу с помощью одного запроса?

Итак, у меня есть модель данных, которая настроена с таблицей, содержащей столбцы NAME, ID и CONDITION для ряда объектов (каждый объект имеет уникальный идентификационный номер). Остальные атрибуты для этих объектов содержатся в столбцах нескольких соответствующих таблиц в зависимости от типа объекта (с каждым типом связаны разные атрибуты). Все таблицы определенного типа имеют столбец ID, чтобы объекты можно было сопоставить с основным списком.

Я хочу написать sql-запрос, который будет возвращать информацию об объектах нескольких разных типов на основе CONDITION, привязанного к их уникальному ID.

Вот упрощенный пример того, с чем я работаю:

object_master_list
| ID | NAME | CONDITION |
-------------------------
|1234|  obj1|       true|
|0000|  obj2|      false|
|1236|  obj3|       true|
|0001|  obj4|      false|
|5832|  obj5|       true|
|6698|  obj6|      false|
|6699|  obj7|      false|


obj_type_one
| ID | NAME |   HEIGHT   |
-------------------------
|1234|  obj1|    o1height|
|0000|  obj2|    o2height|
|5832|  obj5|    o5height|
|6699|  obj7|    o7height|


obj_type_two
| ID | NAME |   WEIGHT   |
-------------------------
|1236|  obj3|    o3height|
|0001|  obj4|    o4height|
|6698|  obj6|    o6height|

Как видите, нет никакой корреляции между NAME и типом или ID и типом. В настоящее время я работаю в iReport, использую конструктор запросов и при необходимости редактирую его вручную.

Прямо сейчас пример запроса будет выглядеть так:

SELECT 
    object_master_list."NAME" AS NAME,
    obj_type_one."HEIGHT" AS HEIGHT,
    obj_type_two."WEIGHT" AS WEIGHT
FROM
    object_master_list INNER JOIN obj_type_one ON object_master_list."ID" =    
obj_type_one."ID"
    INNER JOIN obj_type_two ON obj_type_two."ID" = object_master_list."ID"
WHERE
    object_master_list."CONDITION" = 'true'

Мои данные не возвращают результатов. Из исследования, которое я провел по соединениям sql, я считаю, что это происходит: sql join isue

Где круг «А» представляет мой основной список.

iReport хранит и использует значения, возвращаемые запросом, построчно, с полем для каждого столбца. Так что в идеале я должен закончить с этим:

$F{NAME} which will receive the following values in succession ("obj1", "obj3", "obj5") 
$F{HEIGHT}  with value series (o1hieght, null, o5height)
$F{HEIGHT} with value series (null, o3weight, null)

Я полагаю, что представление таблицы будет выглядеть так:

| NAME |  HEIGHT  |  WEIGHT  |
------------------------------
|  obj1|  o1height|      null|
|  obj3|      null|  o3weight|
|  obj5|  o5height|      null|

Мой вопрос в том, как мне это сделать?

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

Заранее спасибо за любые ответы.


person Sam Hazleton    schedule 24.07.2013    source источник
comment
Можете ли вы показать ожидаемый результат на основе ваших примеров таблиц?   -  person Grisha Weintraub    schedule 24.07.2013
comment
да, хороший момент. Я отредактирую свой вопрос.   -  person Sam Hazleton    schedule 24.07.2013


Ответы (1)


Вы можете использовать left join следующим образом:

select o1.name, o2.height, o3.weight
from object_master_list o1 left join obj_type_one o2 on o1.id = o2.id 
                           left join obj_type_two o3 on o1.id = o3.id
where o1.condition = 'true'

скрипт SQL

person Grisha Weintraub    schedule 24.07.2013
comment
не приведет ли это к дублированию записей из основного списка? - person Sam Hazleton; 24.07.2013
comment
@GrishaWeintraub Спасибо за ссылку. Я также попробовал что-то с вашей ссылкой, и я думаю, что двойное левое соединение может не соответствовать тому, что хотел Сан? Например, если главная таблица имеет идентификаторы от 1 до 10, первая таблица имеет 1-4, а вторая таблица имеет 6-9, то результат двойного левого соединения будет включать от 1 до 10, что, я думаю, отличается от того, что Сэм хотел, что 1-4 и 6-9 (не 5 и 10)? - person J.DoG; 14.09.2017
comment
@J.DoG В этом случае и высота, и вес будут нулевыми, и если вы не хотите, чтобы они были в результате, вы можете легко отфильтровать их, добавив следующее в предложение where: и не (высота равна нулю, а вес нулевой). - person Grisha Weintraub; 14.09.2017