2017-09-03 173 views
2

我有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。在这种情况下,即时变得空。

我该如何解决这个问题?

回答

1

这是一个有趣的问题。我相信下面可以直观,美观的解决方案(我用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 stackoverflow; 
use stackoverflow; 
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中使用小写字母,因为大写字母应该用在强调重要的一点。我也建议这种风格。

+0

感谢您的回复。在上面的查询中,如果errorXml的typecode为99,12,11。那么预期的重现应该是未知的。我怎样才能做到这一点?这是我卡在 – keanu

+0

@keanu请检查更新的答案。原来的声明之后有一个新的选择声明。 –

+0

今天你是我最爱的人,我的朋友。这个查询很漂亮。万分感谢!! – keanu

0

这个怎么样:做一个子查询来为每个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 
相关问题