避免第三表乘以结果

时间:2015-06-24 15:16:01

标签: sql database join

我有三张桌子。

缺陷:用于存储找到的缺陷的主表。

FollowUp :存储特定缺陷后续内容的表。

Defect_Attach :相关表格使用了缺陷和跟进的所有照片附件。

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),我的结果就会成倍增加。

更新 结果:

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

加入THIRD表:

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

1 个答案:

答案 0 :(得分: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

照片名称和跟进日期与彼此无关。如果一个列表比另一个列表长,则它们只是按字母顺序排列。