有没有办法比较PL/SQL中一列中的多行?

Kev*_*ter 0 oracle plsql

我已经使用SQL超过25年,但我对Oracle相对较新.我以前的经验是在DB2和SQL Server中.

我被要求编写一个脚本,通过以下布局查看表:

OrderNo int
ClientID varchar(20)
Order_Date datetime
ProductCode varchar(5)
CreditLimit money
AccountNo varchar(25)

用户在每个订单上输入客户的CreditAccountNo.(我知道它应该从一个表中提取,但它是一个自行开发的应用程序,并且他们没有这样写.有一天,我会让他们让我解决这个问题.)

问题是,虽然有些客户确实有多个信用账户,但大多数只有一个.但是用户经常错误地输入错误的帐号.他们希望我编写一个查看每个clientid的脚本,并显示表中有多个帐号的客户端.

通常,我会有这样的东西(伪代码):

ClientID Cursor
    Read distinct ClientID
    Order Cursor
        Read Order Record for ClientID
        If first iteration, set variable X = AccountNo
        If AccountNo <> X print ClientID, X, AccountNo
        Read next row
    Loop
    Read next row
Loop
Run Code Online (Sandbox Code Playgroud)

我想知道是否没有PL/SQL命令让我废除第二个循环.

希望这个问题有道理.

Mat*_*eak 5

为什么不呢?

SELECT distinct client_id, accountNo
FROM (
SELECT client_id, 
       accountNo, 
       count(distinct accountNo) 
            over ( partition by client_id) client_account_count
FROM your_table
) 
where client_account_count > 1;
Run Code Online (Sandbox Code Playgroud)

更新

根据Justin Cave的评论中的建议,为每个帐号添加了行数.这有助于区分可能正确的帐号和可能错误的帐号.

SELECT distinct client_id, accountNo, cnt
FROM (
SELECT client_id, accountNo, 
count(distinct accountNo) over ( partition by client_id) client_account_count, 
count(*) over ( partition by client_id, accountNo) cnt
FROM your_table
) 
where client_account_count > 1;
Run Code Online (Sandbox Code Playgroud)

  • 我倾向于在混合中添加一个`count(*)over(partition by client_id)`,这样你就可以看到每个`accountNo`值的常见程度.据推测,最常见的帐号将是正确的帐号. (2认同)