子查询 - 如果与最高值不匹配,则返回NULL

时间:2014-08-12 04:56:49

标签: sql sql-server subquery

我想从我的测试项目的表中选择最高余额数。

例如,   如果用户说,他想知道第5个最高余额,我的查询应该返回相应的名称。

以下是该方案的示例测试表:

CREATE TABLE ACCT_MSTR(
    ACCTID INTEGER PRIMARY KEY,
    NAME VARCHAR(50),
    CITY VARCHAR(20),
    BRID VARCHAR(5),
    DOO DATETIME,
    CBALANCE MONEY,
    UBALANCE MONEY,
    STATUS VARCHAR(1)
)

INSERT INTO ACCT_MSTR VALUES(101, 'SARA', 'BLR', 'BR1', GETDATE(), 1000, 1000, 'A')
INSERT INTO ACCT_MSTR VALUES(102, 'SANTHOSH', 'BLR', 'BR10', GETDATE() - 40, 5500, 100, 'A')
INSERT INTO ACCT_MSTR VALUES(103, 'KAVIN', 'GOBI', 'GI20', GETDATE() - 100, 2500, 10500, 'U')
INSERT INTO ACCT_MSTR VALUES(104, 'ARAVIND', 'GOBI', 'GI20', GETDATE() - 20, 10000, 5500, 'A')
INSERT INTO ACCT_MSTR VALUES(105, 'BALA', 'HYD', 'HYD2', GETDATE()-1000, 1000, 500, 'U')
INSERT INTO ACCT_MSTR VALUES(106, 'PRABU', 'TUP', 'TUP25', GETDATE() - 1000, 7500, 1000, 'A')
INSERT INTO ACCT_MSTR VALUES(107, 'ANBU', 'CHE', 'CHE1', GETDATE()-250, 8000, 1000, 'A')
INSERT INTO ACCT_MSTR VALUES(108, 'AMAR', 'CHE', 'CHE3', GETDATE()-2500, 7800, 1000, 'U')
INSERT INTO ACCT_MSTR VALUES(109, 'DHINESH', 'CBE', 'CBE1', GETDATE()-150, 3500, 1000, 'A')
INSERT INTO ACCT_MSTR VALUES(110, 'DUPARAVIND', 'GOBI', 'GI20', GETDATE() - 20, 10000, 5500, 'A')
INSERT INTO ACCT_MSTR VALUES(111, 'DUPSANTHOSH', 'BLR', 'BR10', GETDATE() - 40, 5500, 100, 'A')

我使用了以下查询(第5高):

SELECT NAME FROM ACCT_MSTR
WHERE CBALANCE = ( SELECT MIN(CBALANCE)
                    FROM ACCT_MSTR
                    WHERE CBALANCE IN ( SELECT DISTINCT TOP 5 CBALANCE 
                                        FROM ACCT_MSTR 
                                        ORDER BY CBALANCE DESC
                                    )
                )

如果我想知道无效的第15个最高值(仅表12中的记录总数),它应该返回NULL。相反,它返回表中的最后一个最高值,因为我使用 TOP 15

如果在这种情况下它与给定条件不匹配,任何想法都会返回NULL。

1 个答案:

答案 0 :(得分:2)

假设您正在使用SQL Server,您可以:

declare @name varchar(50)

select @name = name
from   (
       select  row_number() over (order by CBALANCE desc) rn
       ,       name
       from    acct_mstr
       ) as SubQueryAlias
where  rn = 15

-- Return a rowset of one row, even if no row matched
-- the where clause above
select  @name as name