嵌套查询,需要返回第一个结果

时间:2017-09-03 06:53:20

标签: sql hsqldb select-case

我有两张桌子

表错误代码:

type_code    desc
01           Error101
02           Error99
03           Error120 

表格ErrorXML:

row_index     typeCode
1             87
2             02
3             01

输出应该是2个表之间第一个匹配的type_code的描述(列desc)

预期输出: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)

但是当两个表之间没有共同的类型代码(连接条件)时,此查询不会返回字符串UNKNOWN。在这种情况下,我得到null。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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');

Final-1引用:生成表时尽量使用相同的列名。即我建议ErrorXML使用type_code而不是typeCode

最终引用:我选择在SQL中使用较低的字母,因为应该使用大写字母,同时强调重要的一点。我也建议那种风格。

答案 1 :(得分: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