0

さらにいくつかの結合を追加した後、結合を行うと重複やその他のデータが表示されます。私が間違っている可能性のあるアイデアはありますか?

重複なしで機能した古いコード:

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

これは私の新しいコードです:

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, 
    pr.PlanName
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 
    left join BIL_ARTRANSLOG AR 
        ON ctl.chargekey = ar.chargekey 
    left join BIL_PAYORPLANS PR 
        ON PR.PAYORPLANKEY = AR.PAYORPLANKEY
WHERE
    (
        ctl.Transtypelu = 4 
        and ar.TransTypeLU = 4 
        AND (
            (
                ctl.descr <> 'Client Payment' 
                and AR.ARDescr <> 'Client Payment' 
                AND ctl.descr <> 'Copayment'
                and AR.ARDescr <> 'Copayment'
            ) OR ctl.descr IS NULL 
            or ar.ARDescr 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, 
    NULL as planname
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

次の行を追加しました:

left join BIL_ARTRANSLOG AR 
    ON ctl.chargekey = ar.chargekey 
left join BIL_PAYORPLANS PR 
    ON PR.PAYORPLANKEY = AR.PAYORPLANKEY
4

2 に答える 2

0

"union" と "union all" の違いは、前者が個別のレコードを返すのに対して、後者はすべてのレコードを返すことです。レコードを重複させたくない場合は、前者を使用してください。

于 2013-03-19T15:10:53.653 に答える
0

結合をいくつか追加したところ、突然重複した行が表示された場合は、結合されたテーブルの 1 つまたは両方に、他の結合されたテーブルには存在しない 1 対多の関係がある可能性があります。aを実行してSELECT *、重複レコードと思われるものの異なる列を確認してください。

SELECTステートメントの前に次のものを付けることで、重複を削除できます。

SELECT DISTINCT
    dbo.dateonly(ctl.datetrans) AS DateRecorded, 
    L.Clientkey AS ClientNum, 
    L.Fullname, 
    ....
于 2013-03-19T15:15:33.293 に答える