我的SQL查询正在使用INNER Join创建更多记录

时间:2018-09-16 07:30:40

标签: sql-server

下面是我一直在使用的查询,直到被要求连接下面称为Disiposition的另一个表。

DispositionID    Disposition
------------------------------------
    1            All Good
    2            Used with problems 
    3            Rework
    4            Scrapped
    5            Return to Vendor

Rejections表(已经链接到该查询也有一个DispositionID列。我想要做的就是联接上表,以显示5个处置中的哪一个应用于每次检查。每次尝试执行某项操作时,发现的记录总数从6,841增加到34,205,因此,当我知道只分配了上面的一种配置时,似乎将其中的每种配置分配给原始的6,841条记录将记录添加到数据库中后,任何帮助都会很大。

SELECT 
    qalog.qalid,
    qalog.groupid,
    qalog.logdate,
    qalog.sonumber,
    qalog.partnumber,
    qalog.partnotes,
    qalog.travelerqty,
    qalog.euser,
    qalog.itid,
    qalog.trackingnumber,
    qalog.mdr,
    qalog.expirationdate,
    qalog.ponumber,
    qalog.receiptno,
    qalog.reasonid,
    qalog.rrno,
    rejections.numdiscrp,
    rejections.rrid,
    rejectreason.reason,
    productgroups.groupname,
    disposition.disposition
FROM   
    qalog
INNER JOIN 
    rejections ON qalog.qalid = rejections.qalid
INNER JOIN 
    rejectreason ON rejectreason.rrid = rejections.rrid

INNER JOIN 
    Disposition on Disposition.DispostionID = Rejections.Disposition.ID

INNER JOIN 
    productgroups ON productgroups.pgid = qalog.groupid
WHERE  
    (qalog.logdate >= DATEADD(YEAR, -3, GETDATE()))
    AND (qalog.itid = '3')
    AND (rejectreason.groupid = '0')
     OR (qalog.logdate >= DATEADD(YEAR, -3, GETDATE()))
    AND (qalog.itid = '3')   
    AND (rejectreason.groupid = '3')
ORDER BY 
    qalog.qalid

2 个答案:

答案 0 :(得分:1)

仔细观察您的加入条件:

INNER JOIN disposition ON 
  rejections.dispositionid = 
  rejections.dispositionid

我希望已对您的代码进行了重新格式化,以使其更易于查看

解决问题后,如果仍然得到比预期更多的行,并表明要连接的表中有多行与查询中已有表中的行匹配。这表明您需要添加更多条件,以便行匹配为1:1

例如,如果有一个日期指示处置的有效日期自/至,并且根据业务规则,当前处置的ID为空,那么您加入ID的日期也是datexyz is null

关于您的原始形式(联接中的错误)为何导致行相乘的原因,作为谓词,它始终是正确的,从而实现了我们所说的笛卡尔积。最终得到的行数是左侧的行数乘以右侧的行数。每行最后都与其他行交叉。有时它可能是一种有用的技术,尽管在这种情况下并非如此。正如在其他地方所评论的那样,如果在编码时意外地得到重复,则应着重于弄清它们出现的位置,而不是使用distinct或group再次将其删除。在几乎所有情况下,都可以从源头上防止它们发生,而不是在以后取消,并且它始终是首选,因为它使数据库的工作变得更加轻松

答案 1 :(得分:0)

只是一个建议

观察您的()序列,您似乎在哪里在相同条件下有两个ime

    WHERE  ( qalog.logdate >= Dateadd(year, -3, Getdate()) )
     OR ( qalog.logdate >= Dateadd(year, -3, Getdate()) )

您可以避免

如果OR子句与不同的rejectreason.groupid相关,则应使用
(似乎您已经删除了具有处置方式的联接,但这是添加的,但是如果不需要,则可以删除)

   SELECT   qalog.qalid,
            qalog.groupid,
            qalog.logdate,
            qalog.sonumber,
            qalog.partnumber,
            qalog.partnotes,
            qalog.travelerqty,
            qalog.euser,
            qalog.itid,
            qalog.trackingnumber,
            qalog.mdr,
            qalog.expirationdate,
            qalog.ponumber,
            qalog.receiptno,
            qalog.reasonid,
            qalog.rrno,
            rejections.numdiscrp,
            rejections.rrid,
            rejectreason.reason,
            productgroups.groupname,
            disposition.disposition
    FROM   qalog

    INNER JOIN disposition on disposition.dispositionid = rejections.dispositionid

    INNER JOIN rejections ON qalog.qalid = rejections.qalid
    INNER JOIN rejectreason ON rejectreason.rrid = rejections.rrid
    INNER JOIN productgroups ON productgroups.pgid = qalog.groupid
    WHERE   qalog.logdate >= Dateadd(year, -3, Getdate()) 
    AND  qalog.itid = '3' 
    AND  ( rejectreason.groupid = '0'   OR rejectreason.groupid = '3' )
    ORDER  BY qalog.qalid