這是一個有趣的問題。我相信下面可以直觀,美觀的解決方案(我用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中使用小寫字母,因爲大寫字母應該用在強調重要的一點。我也建議這種風格。
感謝您的回覆。在上面的查詢中,如果errorXml的typecode爲99,12,11。那麼預期的重現應該是未知的。我怎樣才能做到這一點?這是我卡在 – keanu
@keanu請檢查更新的答案。原來的聲明之後有一個新的選擇聲明。 –
今天你是我最愛的人,我的朋友。這個查詢很漂亮。萬分感謝!! – keanu