Sql 在联接上添加行后获取重复项

Sql 在联接上添加行后获取重复项,sql,duplicates,Sql,Duplicates,在添加了几个连接之后,当我进行连接时,我会得到重复的数据和其他数据。你知道我可能做错了什么吗 没有重复的旧代码: SELECT dbo.dateonly(ctl.datetrans) AS DateRecorded, L.Clientkey AS ClientNum, L.Fullname, cs.Datesvc, cs.chargekey, ctl.CheckNum, ctl.ReceivedFrom, ctl.De

在添加了几个连接之后,当我进行连接时,我会得到重复的数据和其他数据。你知道我可能做错了什么吗

没有重复的旧代码:

SELECT
    dbo.dateonly(ctl.datetrans) AS DateRecorded, 
    L.Clientkey AS ClientNum, 
    L.Fullname, 
    cs.Datesvc, 
    cs.chargekey, 
    ctl.CheckNum, 
    ctl.ReceivedFrom, 
    ctl.Delta, 
    CONVERT(varchar(10), dept.deptkey) AS Deptkey, 
    dept.DeptName, 
    dept.PgmName, 
    CONVERT(varchar(10), dept.pgmKey) AS PGMKey, 
    ctl.Transtypelu
FROM
    bil_Chargetranslog ctl 
    LEFT JOIN dbo.BIL_ChargeSlips cs 
        ON cs.Chargekey = ctl.Chargekey 
    LEFT JOIN dbo.BLV_Clients L 
        ON cs.ClientKey = L.ClientKey 
    LEFT JOIN Blv_DeptPgm dept 
        ON dept.Pgmkey = cs.PgmLU
WHERE
    (
        ctl.Transtypelu = 4 
        AND (
            (
                ctl.descr <> 'Client Payment' 
                AND ctl.descr <> 'Copayment'
            ) OR ctl.descr IS NULL
        )
    )

UNION ALL

/* note below that the checknum is converted to a varchar for the query*/ 
SELECT 
    dbo.dateonly(daterecorded) AS daterecorded, 
    L.Clientkey AS ClientNum, 
    L.Fullname, 
    DatePayment, 
    NULL AS chargekey, 
    CONVERT(varchar(15), checknum) AS checknum, 
    NULL AS receivedfrom, 
    (- 1 * Amount) AS delta, 
    CONVERT(varchar(10), dept.deptkey) AS Deptkey, 
    dept.DeptName, 
    dept.PgmName, 
    CONVERT(varchar(10), dept.pgmKey) AS PGMKey, 
    4 AS transtypelu
FROM
    bil_clientdeposit 
    LEFT JOIN dbo.BLV_Clients L 
        ON bil_clientdeposit.ClientKey = L.ClientKey 
    LEFT JOIN Blv_DeptPgm dept 
        ON dept.Pgmkey = Bil_ClientDeposit.PgmKey

“union”和“union all”的区别在于后者返回所有记录,而前者返回不同的记录。如果不需要重复的记录,请使用前者。

如果添加了两个额外的联接,并且突然看到重复的行,则在一个或两个联接表中可能存在一对多关系,而在其他联接表中不存在。尝试执行
选择*
并查看哪些列显示为重复记录

您可以通过在
SELECT
语句前面添加以下内容来删除重复项:

SELECT DISTINCT
    dbo.dateonly(ctl.datetrans) AS DateRecorded, 
    L.Clientkey AS ClientNum, 
    L.Fullname, 
    ....

好主意,我先看看select得到的是什么。没什么,我认为有些行有时有额外的数据,而有些行没有。我将仅使用SELECT语句来检查这一点。如果是这种情况,则它们不是重复的行。
left join BIL_ARTRANSLOG AR 
    ON ctl.chargekey = ar.chargekey 
left join BIL_PAYORPLANS PR 
    ON PR.PAYORPLANKEY = AR.PAYORPLANKEY
SELECT DISTINCT
    dbo.dateonly(ctl.datetrans) AS DateRecorded, 
    L.Clientkey AS ClientNum, 
    L.Fullname, 
    ....