2016-06-14 77 views
2

這是我的查詢。從本質上講,我想用LEFT JOIN檢索值@Remote.ImportantVal左連接和通配符不返回結果?

declare @Local table 
(
    LocalId varchar(15), 
    Match1 int, 
    Match2 varchar(5) 
) 
insert into @local select '12_012_112', 5, 'MATH' 
insert into @local select '12_012_113', 5, 'MATH' 
insert into @local select '12_012_114', 5, 'MATH' 

declare @Remote table 
(
    RemoteId varchar(15), 
    ImportantVal varchar(20), 
    Match1 int, 
    Match2 varchar(5) 
) 
insert into @Remote select 'ABC0012_012_112', 'Important', 5, 'MATH' 
insert into @Remote select 'ABC0112_012_113', 'Important', 5, 'MATH' 
insert into @Remote select 'ABC0012_012_114', 'Important', 5, 'MATH' 

select l.localId, r.RemoteId, r.ImportantVal 
from @Local l left join @Remote r on 'ABC%' + l.LocalId like r.RemoteId 
and l.Match1 = r.Match1 
and r.Match2 = r.Match2 

看來問題是%,但它是必要的,因爲後ABC的2個字符將永遠是相同的。在上一個查詢中,兩個表不匹配,並返回3個空行。

如果我用這樣的事情,那麼只有2點相匹配的行,因爲它基本上是一個inner join

select l.localId, r.RemoteId, r.ImportantVal 
from @Local l left join @Remote r on 'ABC00' + l.LocalId like r.RemoteId 
and l.Match1 = r.Match1 
and r.Match2 = r.Match2 

我也與where條款試過left join,但只是把它轉換成一個inner join所以什麼也沒有返回:

select l.localId, r.RemoteId, r.ImportantVal 
from @Local l left join @Remote r on 'ABC%' + l.LocalId like r.RemoteId 
where l.Match1 = r.Match1 
and r.Match2 = r.Match2 

使用left join%,我怎麼能在兩個表中的所有三排匹配嗎?

謝謝。

回答

3

變化的加入子句中的參數的順序:

from @Local l left join @Remote r on r.RemoteId like 'ABC%' + l.LocalId 

,你應該得到你所期望的三排。 (至少我的測試給出了這個)。

通配符具有在等表達的右手側上的圖案被用作文檔中所述:

MATCH_EXPRESSION [NOT] LIKE模式[ESCAPE ESCAPE_CHARACTER]

+0

謝謝。令人驚訝的是,改變訂單的工作。 – rbhat

+0

這是一種錯誤嗎?僅僅因爲參數的順序,結果集會發生變化是沒有意義的。 – rbhat

+0

@rbhatup據我所知,它是由設計,當然不是一個錯誤。這只是運營商的定義。 – jpw

0

你可以在你的WHERE中做兩個不同的子句;

樣本數據;

CREATE TABLE #Local (LocalId varchar(15), Match1 int, Match2 varchar(5)) 
INSERT INTO #Local 
VALUES 
('12_012_112', 5, 'MATH') 
,('12_012_113', 5, 'MATH') 
,('12_012_114', 5, 'MATH') 

CREATE TABLE #Remote (RemoteId varchar(15), ImportantVal varchar(20), Match1 int, Match2 varchar(5)) 
INSERT INTO #Remote 
VALUES 
('ABC0012_012_112', 'Important', 5, 'MATH') 
,('ABC0112_012_113', 'Important', 5, 'MATH') 
,('ABC0012_012_114', 'Important', 5, 'MATH') 

實際查詢;

SELECT 
l.LocalId 
,r.RemoteId 
,r.ImportantVal 
FROM #Local l 
LEFT JOIN #Remote r 
ON r.RemoteId LIKE 'ABC%' 
AND l.LocalID = RIGHT(r.RemoteId,LEN(l.LocalId)) 
AND l.Match1 = r.Match1 
AND l.Match2 = r.Match2 
0

爲什麼不乾脆:

select l.localId, r.RemoteId, r.ImportantVal 
from @Local l left join @Remote r on RIGHT(l.LocalId,10) = r.RemoteId 
and l.Match1 = r.Match1 
and r.Match2 = r.Match2 

,或者,如果 「ABC」 是顯著,然後

select l.localId, r.RemoteId, r.ImportantVal 
from @Local l left join @Remote r on RIGHT(l.LocalId,10) = r.RemoteId 
and l.LocalId like 'ABC%' 
and l.Match1 = r.Match1 
and r.Match2 = r.Match2