как объединить таблицы с отношением 1 ко многим в 1 строку записи

Мне нужно объединить две таблицы с отношением 1 ко многим, используя объединение, но безуспешно.

введите здесь описание изображенияЯ пытался использовать этот код

select a.equipmentid,
a.codename,
a.name,
a.labelid,
a.ACQUISITIONDATE,
a.description
from TBL_EQUIPMENTMST a where
a.partofid = '57'
union all
select first 1 b.warrantyid, b.startdate, b.enddate from tbl_equipwarranty b
inner join TBL_EQUIPMENTMST c
on b.equipmentid=c.equipmentid
where c.partofid = '57' and b.servicetype='service' order by b.warrantyid desc
union all
select first 1 d.warrantyid, d.startdate, d.enddate from tbl_equipwarranty d
inner join TBL_EQUIPMENTMST e
on d.equipmentid=e.equipmentid
where e.partofid = '57' and d.servicetype='product' order by d.warrantyid desc

может ли кто-нибудь помочь мне, как получить ожидаемый результат на моем изображении. Я использую firebird в качестве базы данных. Если у вас есть решение в mysql, пожалуйста, сообщите мне, и я попытаюсь найти аналог в firebird.


person Mandz    schedule 05.11.2014    source источник
comment
за исключением псевдонимов, ваши 2-й и 3-й запросы кажутся идентичными?   -  person FuzzyTree    schedule 05.11.2014
comment
извините относительно на то же самое. Я исправил это в своем коде, но он все еще показывает ошибку.   -  person Mandz    schedule 05.11.2014


Ответы (2)


Секрет в том, чтобы присоединиться к tbl_equipwarranty дважды, используя 2 разных псевдонима. Один для гарантии на обслуживание и один для гарантии на продукт. Это можно сделать, указав тип службы как часть соединения. Следующее использует соединения ANSI, поэтому, вероятно, будет работать в firebird и mysql:

SELECT
    a.equipmentid,
    a.codename,
    a.name,
    a.labelid,
    a.ACQUISITIONDATE,
    a.description,
    a.partofid,
    w1.warrantyid as serviceidwarranty, 
    w1.startdate, 
    w1.enddate,
    w2.warrantyid as productidwarranty, 
    w2.startdate, 
    w2.enddate
FROM TBL_EQUIPMENTMST a 
INNER JOIN tbl_equipwarranty w1 
    ON w1.equipmentid = a.equipmentid AND w1.servicetype = 'service'
INNER JOIN tbl_equipwarranty w2 
    ON w2.equipmentid = a.equipmentid AND w2.servicetype = 'Product'
WHERE
a.partofid = '57'
person Donal    schedule 05.11.2014
comment
Ты спасатель жизни. Обладая этими знаниями, я теперь могу легко отображать отчет, используя 1 оператор выбора. Я планировал использовать 3 выбора и объединить его с 1 набором записей и отображать его одновременно с моим последним средством. Спасибо за новые знания ^_^ - person Mandz; 05.11.2014
comment
@Mandz Рад быть полезным :-) - person Donal; 05.11.2014
comment
У меня другая проблема. Теперь мне нужно объединить таблицы с отношением 1 к N, но теперь мне нужно только последнее значение N. Вы можете мне помочь? Заголовок stackoverflow.com/questions/26882396/ - person Mandz; 12.11.2014

Это даст вам требуемый результат только в том случае, если у вас есть уникальный идентификатор гарантии для идентификатора оборудования в таблице.

SELECT 
a.equipmentid,
a.codename,
a.name,
a.labelid,
a.ACQUISITIONDATE,
a.description,
a.partofid,
B.warrantyid AS serviceidwarranty,
B.Startdate,
B.Enddate,
C.warrantyid AS productidwarranty,
C.Startdate,
C.Enddate

FROM TBL_EQUIPMENTMST A
LEFT OUTER JOIN tbl_equipwarranty B ON A.equipmentid=B.equipmentid AND B.Servicetype='Service'
LEFT OUTER JOIN tbl_equipwarranty C ON A.equipmentid=C.equipmentid AND C.Servicetype='Product'
person Bikash Pradhan    schedule 05.11.2014
comment
Я попробовал ваш код, сэр, и он тоже работает. Извините, если не могу выбрать ваш пост в качестве ответа, так как я уже выбрал свой ответ некоторое время назад. В любом случае спасибо. ^_^ - person Mandz; 05.11.2014