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

Posted

技术标签:

【中文标题】子查询 - 如果不匹配最高值,则返回 NULL【英文标题】:Sub Query - Return NULL, if it does not match the highest 【发布时间】:2014-08-12 04:56:48 【问题描述】:

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

例如, 如果用户说,他想知道第 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 的任何想法。

【问题讨论】:

这似乎是关于 SQL Server 语法 not mysql 的问题,因为在表定义中使用了 TOP 关键字和 MONEY 数据类型。跨度> 【参考方案1】:

假设您使用的是 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

【讨论】:

以上是关于子查询 - 如果不匹配最高值,则返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 多个子查询全部或全部返回

MySQL的模糊查询

SQL 在 select 子查询中只返回一行或 null

Graphql - 获取完整的子对象,如果不存在则为 null

javascript中的子节点查找,childNodes和children

JPA JPQL - 如果不使用子对象(没有主键/外键关系)并且可以删除,则返回的查询