要求返回第一个结果的嵌套查询
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中使用小写字母,因为在强调重点时应该使用大写字母。我也推荐那个风格。
我有 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中使用小写字母,因为在强调重点时应该使用大写字母。我也推荐那个风格。