2017-09-03 84 views
2

我有2代表作爲這樣需要的第一個結果嵌套查詢返回

表ErrorCode的:

type_code desc 
01   Error101 
02   Error99 
03   Error120 

表ErrorXML:

row_index  typeCode 
1    87 
2    02 
3    01 

輸出應該說明(列desc)的第一個匹配type_code之間的兩個表

預期輸出: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) 

但是,當有2個表之間沒有共同的類型代碼(連接條件)此查詢不返回字符串UNKNOWN。在這種情況下,即時變得空。

我該如何解決這個問題?

回答

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'); 

最終-1報價:生成你的表儘可能使用相同的列名稱。即我建議ErrorXML使用type_code而不是typeCode

最後的報價:我選擇在SQL中使用小寫字母,因爲大寫字母應該用在強調重要的一點。我也建議這種風格。

+0

感謝您的回覆。在上面的查詢中,如果errorXml的typecode爲99,12,11。那麼預期的重現應該是未知的。我怎樣才能做到這一點?這是我卡在 – keanu

+0

@keanu請檢查更新的答案。原來的聲明之後有一個新的選擇聲明。 –

+0

今天你是我最愛的人,我的朋友。這個查詢很漂亮。萬分感謝!! – keanu

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 
相關問題