子查询 - 如果不匹配最高值,则返回 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的主要内容,如果未能解决你的问题,请参考以下文章
Graphql - 获取完整的子对象,如果不存在则为 null