2015-10-30 23 views
0

我想弄清楚爲什麼利用CTE去除錯誤的信息,但我不能直接在JOIN中使用相同的數據轉換。因此,舉例來說,我有以下DOCUMENT表看起來像這樣:CTE的作品,但簡單的JOIN不會?

RECTYPE TYPEDESC    PAGE DOCIMGLINK 
--------------------------------------------------------------------------- 
D  Delayed Birth Record 00127 1910-007704118500089870170008786670 
D  Birth Record   00056 1910-007701897300089870160008810074 
D  Delayed Birth Record 00118 1912-007704116600089870180008786651 
D  Birth Record   00004 1913-007702338100089870200008804037 
D  Birth Record   00249 1913-007702362500089870210008804281 

然後我有一個表DM_CONTENT以下信息:

DM_ID DM_PATH 
------------------------------------------------------------ 
1  BR\1910\1910-007704118500089870170008786670.TIF 
2  BR\1910\1910-007701897300089870160008810074.TIF 
3  BR\1912\1912-007704116600089870180008786651.TIF 
4  BR\1913\1913-007702338100089870200008804037.TIF 
5  BR\1913\1913-007702362500089870210008804281.TIF 

正如你所看到的,DM_PATHDOCIMGLINK與嵌入附加信息。我想用DOCIMGLINK作爲JOIN兩個表的唯一標識符,並將所有信息帶回。我想,我們只是解析出我想要比較的部分,而且應該這樣做。

SELECT 
    D.RECTYPE 
    ,D.TYPEDESC 
    ,D.PAGE 
    ,D.DOCIMGLINK 
    ,DMC.DM_ID 
    ,DMC.DM_PATH 
FROM 
    DOCUMENT D 
    LEFT JOIN DM_CONTENT DMC 
     ON D.DOCIMGLINK = PARSENAME(REPLACE(DMC.DM_PATH, '\', '.'), 2) 

沒有結果...奇怪的是,應該工作,但事實並非如此。我的解決辦法,而不是是使用一個CTE使用完全相同的PARSENAME功能:

WITH CTE AS 
(SELECT 
    DM_ID 
    ,PARSENAME(REPLACE(DM_PATH, '\', '.'), 2) AS 'DM_PATH' 
FROM 
    DM_CONTENT) 
SELECT 
     D.RECTYPE 
     ,D.TYPEDESC 
     ,D.PAGE 
     ,D.DOCIMGLINK 
     ,CTE.DM_ID 
     ,CTE.DM_PATH 
    FROM 
     DOCUMENT D 
     LEFT JOIN CTE 
     ON D.DOCIMGLINK = CTE.DM_PATH 

帶回了積極的成果!雖然我有這個工作解決方案,但我想了解爲什麼我不能以其他方式做到這一點。必須有一些簡單的東西我錯過了,這讓我很生氣。提前感謝您幫助我無知的腦袋放屁!

+0

我想用解析名稱,查看DM_Content的結果......所以使用子查詢'LEFT JOIN(SELECT DM_ID,DM_PATH,D.DOCIMGLINK = PARSENAME(REPLACE(DMC.DM_PATH, '\' ,'。'),2)作爲DOCIMGLINK FROM DM_CONTENT)DMC'運行獨立於其餘部分的select,看看你是否獲得了你期望的連接結果。你可以考慮把它做成一個完整的外部連接,所以你可以在解決問題時看到雙方。 – xQbert

+0

不可複製,http://sqlfiddle.com/#!3/c0f36/1 –

+0

@xQbert只有PARSENAME的結果是一個剝離的鏈接(沒有目錄或圖像類型信息)。它看起來與DOCUMENT.DOCIMGLINK – PicoDeGallo

回答

0

你確定這是相同的代碼?您發佈的示例工作正常...以及一旦我變成了可消費的東西。

create table #Document 
(
    RECTYPE char(1) 
    , TYPEDESC varchar(50) 
    , PAGE varchar(10) 
    , DOCIMGLINK varchar(50) 
) 

insert #Document 
select 'D', 'Delayed Birth Record', 00127, '1910-007704118500089870170008786670' union all 
select 'D', 'Birth RecorD', 00056, '1910-007701897300089870160008810074' union all 
select 'D', 'Delayed Birth Record', 00118, '1912-007704116600089870180008786651' union all 
select 'D', 'Birth RecorD', 00004, '1913-007702338100089870200008804037' union all 
select 'D', 'Birth RecorD', 00249, '1913-007702362500089870210008804281' 

create table #DM_CONTENT 
(
    DM_ID int 
    , DM_PATH varchar(100) 
) 

insert #DM_CONTENT 
select 1, 'BR\1910\1910-007704118500089870170008786670.TIF' union all 
select 2, 'BR\1910\1910-007701897300089870160008810074.TIF' union all 
select 3, 'BR\1912\1912-007704116600089870180008786651.TIF' union all 
select 4, 'BR\1913\1913-007702338100089870200008804037.TIF' union all 
select 5, 'BR\1913\1913-007702362500089870210008804281.TIF' 

SELECT 
    D.RECTYPE 
    ,D.TYPEDESC 
    ,D.PAGE 
    ,D.DOCIMGLINK 
    ,DMC.DM_ID 
    ,DMC.DM_PATH 
FROM 
    #DOCUMENT D 
    LEFT JOIN #DM_CONTENT DMC 
     ON D.DOCIMGLINK = PARSENAME(REPLACE(DMC.DM_PATH, '\', '.'), 2) 

drop table #DM_CONTENT 
drop table #Document 
+0

正面 - 我剛剛複製並粘貼了我提供的上述兩個示例,而CTE正常工作,而JOIN則沒有。我覺得最好奇 - 都是VARCHAR列。這是一個SQL 2012環境。 – PicoDeGallo

+0

我剛剛在2005年,2008年2月,2012年和2014年嘗試了這個包括您的示例。所有工作都完全相同,並返回兩個查詢的行。其中兩個甚至是區分大小寫的數據庫。您的代碼存在一些問題,或者數據與您發佈的數據略有不同。我無法告訴你它是什麼,但代碼中沒有任何內容會這樣做。 –

+0

我很感激幫助 - 我會在數據中查找可能導致此問題的異常情況。 – PicoDeGallo

相關問題