2013-07-24 1 views
3

Итак, у меня есть модель данных, которая настроена с таблицей, содержащей 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

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

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 в основной список.

Заранее благодарим за любые ответы.

+1

Вы можете показать ожидаемый результат основан на вашем примере таблицы? –

+0

да, хорошо пункт. Я отредактирую свой вопрос. –

ответ

3

Вы можете использовать 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 Fiddle

+0

это не приведет к дублированию записей из главного списка? –

+0

спасибо за ответ и ссылку. –

+0

Добро пожаловать. –

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