我有两张桌子
表错误代码:
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。
我该如何解决这个问题?
答案 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