Tsql DISTINCT没有删除重复项

Tsql DISTINCT没有删除重复项,tsql,Tsql,我不知道如何在AB-BA方式中使用DISTINCT。例如,我有两列BoughtLoyaltyProgramId,SoldLoyaltyProgramId。但是,即使我使用DISTINCT,当boughtloyaltyprogramid中的相同代码出现在soldloyaltyprogramid中时,它也会产生重复。我不想重复,但我不知道如何与多列和配对工作 以下是存储过程: ALTER PROC AA @LPPProgramID UNIQUEIDENTIFIER , @DateFr

我不知道如何在AB-BA方式中使用DISTINCT。例如,我有两列BoughtLoyaltyProgramId,SoldLoyaltyProgramId。但是,即使我使用DISTINCT,当boughtloyaltyprogramid中的相同代码出现在soldloyaltyprogramid中时,它也会产生重复。我不想重复,但我不知道如何与多列和配对工作

以下是存储过程:

ALTER PROC AA
    @LPPProgramID UNIQUEIDENTIFIER ,
    @DateFrom DATETIME ,
    @DateTo DATETIME
AS 
SELECT DISTINCT TOP ( 5 )
        BoughtLoyaltyProgramId ,
        SoldLoyaltyProgramId ,
        DateTransactionCleared ,
        ExchangeRate
FROM    dbo.PEX_ClearedTransactions
WHERE   DateTransactionCleared >= @DateFrom
        AND DateTransactionCleared < @DateTo
        AND ( BoughtLoyaltyProgramId = @LPPProgramID
              OR SoldLoyaltyProgramId = @LPPProgramID
            )
ORDER BY ExchangeRate;

GO

Distinct是每行的,因此行中列中的值是不同的组合,不会将行中每列中的数据与该行中的其他列进行比较


您可能还希望在Where语句中对列数据进行一些比较。

以下是如何从两列中获取所有不同的值:

SELECT distinct * from
(SELECT BoughtLoyaltyProgramId
FROM dbo.PEX_ClearedTransactions
UNION ALL 
SELECT SoldLoyaltyProgramId
FROM dbo.PEX_ClearedTransactions) as A
也许您想使用行号:


Distinct应用于您查询的所有列,而不仅仅是前2列。如果您考虑所有选定的列,它是否仍然包含重复数据?您可以显示查询结果吗?我不太明白发生了什么事。不清楚你在问什么。向我们展示一些示例数据以提供帮助。如果考虑所有列,则包含重复项。查询结果显示了大量购买的用户ID、SoldUserID、交换数据等等。如果你愿意,我可以得到准确的结果。我想你们说得最好,DISTINCT是每行,而不是每列,我希望所有列都没有重复,但我对TSQL还不够熟练,不知道如何做到这一点。丹尼斯,我昨天试过了,但没有成功。仍然显示Dues。显示你的意思是欺骗,我敢肯定它不会显示我认为是重复的。一个特定的用户名出现在出售,因为你既可以是航空公司点的买方和卖方。@ USER 2689499我想我现在明白了,看看我的编辑答案是否可以让你开始。谢谢你,丹尼斯,我会试试这个,但是你能帮我了解整个存储过程的语法吗?Tim没有办法把它作为存储过程来做吗?它必须是一个CTE?@user2689499:您可以在存储过程中使用CTE而不会出现问题。Tim,我想我要问的是存储过程中的整个语法。如果你能帮我的话,我会在哪里添加CTE,等等。你能帮我弄清楚整个语法吗?不到一年的时间,我对SQLL还很陌生,所以我有很多麻烦。
WITH cte 
     AS (SELECT boughtloyaltyprogramid, 
                soldloyaltyprogramid, 
                datetransactioncleared, 
                exchangerate, 
                RN=Row_number() OVER( 
                    partition BY boughtloyaltyprogramid, soldloyaltyprogramid 
                    ORDER BY exchangerate) 
         FROM   dbo.pex_clearedtransactions 
         WHERE  datetransactioncleared >= @DateFrom 
                AND datetransactioncleared < @DateTo 
                AND ( boughtloyaltyprogramid = @LPPProgramID 
                       OR soldloyaltyprogramid = @LPPProgramID )) 
SELECT TOP(5) * FROM   cte 
WHERE  RN = 1 
ORDER  BY exchangerate