2015-06-24 4 views
0

У меня есть три таблицы.Избегайте результатов умножения третьей таблицы

Дефект: Главный стол, используемый для хранения обнаруженных дефектов.

FollowUp: Таблица, в которой хранится информация о последующих дефектах.

Defect_Attach: Связанная таблица использовала все вложения фотографий для Дефектов и FollowUps.

enter image description here

Как я могу получить дату для всех вложений фото?

Некоторые из этих фотографий были взяты за дефект, а затем более поздние даты были связаны с дефектом во время наблюдения.

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

enter image description here

или

enter image description here

До сих пор мой запрос выглядит следующим образом:

SELECT d.GUID 
     ,p.ATTACHMENTID 
     ,p.REL_OBJECTID 
     ,p.CONTENT_TYPE 
     ,p.ATT_NAME 
     ,p.DATA_SIZE 
     ,d.DateObserved as 'Defect Date' 
     --,f.DateObserved as 'FollowUp Date' 
FROM [ECIMUSR].[DEFECT__ATTACH] p 
    LEFT OUTER JOIN ECIMUSR.DEFECT d on d.ObjectID = p.REL_OBJECTID 
    --LEFT JOIN ECIMUSR.FOLLOWUP f on f.DefectGUID = d.GUID 
WHERE 
    d.GUID = '{E511EA70-F5E5-11E4-8189-6C3BE50ED71F}' 
    ORDER BY [Defect Date] 

Но как только я попробую присоединиться мой третий стол (FOLLOWUP), мои результаты умножаются.

UPDATE: Результаты:

SELECT p.ATT_NAME 
     ,d.DateObserved as 'Defect Date' 
     --,f.DateObserved as 'FollowUp Date' 
FROM [ECIMUSR].[DEFECT__ATTACH] p 
    LEFT OUTER JOIN ECIMUSR.DEFECT d on d.ObjectID = p.REL_OBJECTID 
    --LEFT JOIN ECIMUSR.FOLLOWUP f on f.DefectGUID = d.GUID 
WHERE 
    d.GUID = '{E511EA70-F5E5-11E4-8189-6C3BE50ED71F}' 
    ORDER BY [Defect Date] 

enter image description here

Присоединение третьей таблицы:

SELECT p.ATT_NAME 
     ,d.DateObserved as 'Defect Date' 
     ,f.DateObserved as 'FollowUp Date' 
FROM [ECIMUSR].[DEFECT__ATTACH] p 
    LEFT OUTER JOIN ECIMUSR.DEFECT d on d.ObjectID = p.REL_OBJECTID 
    LEFT JOIN ECIMUSR.FOLLOWUP f on f.DefectGUID = d.GUID 
WHERE 
    d.GUID = '{E511EA70-F5E5-11E4-8189-6C3BE50ED71F}' 
    ORDER BY [Defect Date] 

enter image description here

+0

Какая у вас СУБД? И какие результаты вы получаете в настоящее время (я не уверен, что именно вы подразумеваете под «multiply») – Siyual

+1

У вас есть несколько строк в Followup для каждой фотографии? – Andrew

+0

Если у одного дефекта может быть несколько наблюдений, что вы хотите присоединиться к существующему запросу? Самое последнее наблюдение? Первое продолжение? Или некоторые сводные статистические данные, такие как количество наблюдений, дата первого, дата последнего и т. Д. – MatBailie

ответ

1
SELECT 
    d.DateObserved  AS defect_date, 
    p.ATT_NAME   AS photo_name, 
    f.DateObserved  AS follow_up_date 
FROM 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY REL_OBJECTID 
           ORDER BY ATT_NAME) AS ordinal 
    FROM 
     ECIMUSR.DEFECT__ATTACH 
) 
    p 
FULL OUTER JOIN 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY DefectGUID 
           ORDER BY DateObserved) AS ordinal 
    FROM 
     ECIMUSR.FOLLOWUP 
) 
    f 
     ON f.DefectGUID = p.REL_OBJECTID 
     AND f.ordinal = p.ordinal 
RIGHT JOIN 
    ECIMUSR.DEFECT d 
     ON d.ObjectID = COALESCE(f.DefectGUID, p.REL_OBJECTID) 

бы дать что-то вроде ...

defect_date | photo_name     | follow_up_date 
-------------+-----------------------------+---------------- 
    2014-12-19 | photo1.jpg     | 2015-01-16 
    2014-12-19 | PhotoFollowUp1_20150117.jpg | 2015-03-19 
    2014-12-19 | PhotoFollowUp1_20150324.jpg | 2015-04-17 
    2014-12-19 | PhotoFollowUp1_20150417.jpg | NULL 
    2014-12-19 | PhotoFollowUp2_20150324.jpg | NULL 

Названия фото и следуют до даты не имеют ничего общего с друг с другом. они просто в алфавитном порядке с пробелами, если один список длиннее другого.

+0

(+1) К сожалению, мне нужны даты, чтобы соответствовать имени фотографии. Вы говорите, что нет способа? Я боялся этого. Это имеет смысл. Я надеялся, что кто-то узнает, как я не мог думать. – capdragon

+0

Я дам вам кредит на ответ. Хотя это не то, что я хотел, вы сказали мне, что мне нужно услышать, «это невозможно». – capdragon

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