我想弄清楚爲什麼利用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_PATH
是DOCIMGLINK
與嵌入附加信息。我想用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
帶回了積極的成果!雖然我有這個工作解決方案,但我想了解爲什麼我不能以其他方式做到這一點。必須有一些簡單的東西我錯過了,這讓我很生氣。提前感謝您幫助我無知的腦袋放屁!
我想用解析名稱,查看DM_Content的結果......所以使用子查詢'LEFT JOIN(SELECT DM_ID,DM_PATH,D.DOCIMGLINK = PARSENAME(REPLACE(DMC.DM_PATH, '\' ,'。'),2)作爲DOCIMGLINK FROM DM_CONTENT)DMC'運行獨立於其餘部分的select,看看你是否獲得了你期望的連接結果。你可以考慮把它做成一個完整的外部連接,所以你可以在解決問題時看到雙方。 – xQbert
不可複製,http://sqlfiddle.com/#!3/c0f36/1 –
@xQbert只有PARSENAME的結果是一個剝離的鏈接(沒有目錄或圖像類型信息)。它看起來與DOCUMENT.DOCIMGLINK – PicoDeGallo