要求返回第一个结果的嵌套查询

Nested query that requires the first result to be returned

我有 2 个这样的表

Table 错误代码:

type_code    desc
01           Error101
02           Error99
03           Error120 

Table 错误 XML:

row_index     typeCode
1             87
2             02
3             01

输出应该是两个表

之间第一个匹配的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)

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

我该如何解决这个问题?

这个怎么样:做一个子查询为每个 type_code 带回第一个 row_index。 在 ErrorCodes table 上执行 LEFT OUTER Join,这样您也可以获得 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

这是一个有趣的问题。我相信以下可以是一个直观而漂亮的解决方案(我使用 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;

如果您还需要处理 if query returns no row then for 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 Whosebug;
use Whosebug;
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 引用:生成表时尽量使用相同的列名。 IE。我建议 ErrorXML 使用 type_code 而不是 typeCode

最后引用:我选择在SQL中使用小写字母,因为在强调重点时应该使用大写字母。我也推荐那个风格。