需要的第一个结果嵌套查询返回
问题描述:
我有2代表作为这样需要的第一个结果嵌套查询返回
表ErrorCode的:
type_code desc
01 Error101
02 Error99
03 Error120
表ErrorXML:
row_index typeCode
1 87
2 02
3 01
输出应该说明(列desc)的第一个匹配type_code之间的两个表
预期输出:Error99
我已经到目前为止。
select isnull(descript, 'unknown') as DESCRIPTION
from (select top 1 a.stmt_cd as descript
from ErrorCodes a, ErrorXML b
where a.type_cd = b.typecode
order by b.row_index)
但是,当有2个表之间没有共同的类型代码(连接条件)此查询不返回字符串UNKNOWN。在这种情况下,即时变得空。
我该如何解决这个问题?
答
这是一个有趣的问题。我相信下面可以直观,美观的解决方案(我用desc_
作为列名,而不是desc
这是一个保留字):
select (select desc_ from ErrorCodes x where x.type_code = a.typeCode) desc_
from ErrorXML a
where (select desc_ from ErrorCodes x where x.type_code = a.typeCode) is not null
order by row_index
limit 1;
如果您还需要处理的情况下,如果查询没有返回行则MySQL,下面的语法应该足够了。对于其他数据库,你可以使用类似的封装与ISNULL,NVL等:
select ifnull((select (select desc_ from ErrorCodes x where x.type_code = a.typeCode) desc_ from ErrorXML a where (select desc_ from ErrorCodes x where x.type_code = a.typeCode) is not null order by row_index limit 1), 'UNKNOWN');
为了测试我使用下面的脚本,似乎正常工作:
create database if not exists *;
use *;
drop table if exists ErrorCodes;
create table ErrorCodes
(
type_code varchar(2),
desc_ varchar(10)
);
insert into ErrorCodes(type_code, desc_) values
('01', 'Error101'),
('02', 'Error99'),
('03', 'Error120');
drop table if exists ErrorXML;
create table ErrorXML
(
row_index integer,
typeCode varchar(2)
);
insert into ErrorXML(row_index, typeCode) values
('1', '87'),
('2', '02'),
('3', '01');
最终-1报价:生成你的表尽可能使用相同的列名称。即我建议ErrorXML
使用type_code
而不是typeCode
。
最后的报价:我选择在SQL中使用小写字母,因为大写字母应该用在强调重要的一点。我也建议这种风格。
答
这个怎么样:做一个子查询来为每个type_code返回第一个row_index。 做一个LEFT OUTER在ErrorCodes表上加入,这样你也可以得到NULL。
SELECT
ISNULL(ErrorCodes.desc,'unknown') AS description
ErrorXML.row_index
FROM ErrorCodes
LEFT OUTER JOIN (
SELECT type_code, MIN(row_index) AS row_index
FROM ErrorXML
GROUP BY type_code
) AS ErrorXML ON ErrorCodes.type_code = ErrorXML .type_code
感谢您的回复。在上面的查询中,如果errorXml的typecode为99,12,11。那么预期的重现应该是未知的。我怎样才能做到这一点?这是我卡在 – keanu
@keanu请检查更新的答案。原来的声明之后有一个新的选择声明。 –
今天你是我最爱的人,我的朋友。这个查询很漂亮。万分感谢!! – keanu