2016-07-07 36 views
0

我想加入或選擇僅查找DOC_VER列上兩個表格之間匹配的行。如何加入或與SQL Server中的計算列進行比較?

  • 查詢A確定特定用戶ID下的所有簽出文檔。
  • 查詢B確定哪個簽出文檔具有特定的作者。

查詢A中的表沒有作者值,這就是爲什麼我必須連接表以進行比較。

查詢

SELECT 
    CONCAT (CAST (DOCNUM AS INTEGER), '_', VERSION) AS DOC_VER, 
    DOCNUM, VERSION, CHECKOUT_DIR 
FROM 
    MHGROUP.CHECKOUT 
WHERE 
    CHECKOUT_DIR LIKE '%\0257\%' 

結果甲

DOC_VER  DOCNUM VERSION CHECKOUT_DIR 
-------------------------------------------------------------------------- 
4246295_10 4246295 10  C:\NrPortbl\ATL_IMANAGE\0257\4246295_10.DOC 
6376084_19 6376084 19  C:\NrPortbl\DMSLIBRARY01\0257\6376084_19.DOC 

查詢乙

SELECT 
    CONCAT (CAST (DOCNUM AS INTEGER), '_', VERSION) AS DOC_VER, 
    DOCNUM, VERSION, AUTHOR 
FROM 
    MHGROUP.DOCMASTER 

個結果乙

DOC_VER  DOCNUM VERSION AUTHOR 
-------------------------------------- 
3027872_1 3027872 1  0001 
3027872_2 3027872 2  0001 

回答

3

可以使用ON子句中的表達式:

SELECT * 
FROM MHGROUP.CHECKOUT c JOIN 
    MHGROUP.DOCMASTER dm 
    ON CONCAT(CAST(C.DOCNUM AS INTEGER), '_', C.VERSION) = 
     CONCAT(CAST(DM.DOCNUM AS INTEGER), '_', DM.VERSION) 
WHERE c.CHECKOUT_DIR LIKE '%\0257\%'; 

但是,如果這是你會經常做這樣的事情,我會建議計算列,也許指標:

alter table MHGROUP.CHECKOUT 
    add docver as (CONCAT(CAST(DOCNUM AS INTEGER), '_', VERSION)); 

alter table MHGROUP.DOCMASTER 
    add docver as (CONCAT(CAST(DOCNUM AS INTEGER), '_', VERSION)); 

create index idx_checkout_docver on MHGROUP.CHECKOUT(docver); 
create index idx_docmaster_docver on MHGROUP.docmaster(docver); 

然後,你可以這樣做:

SELECT * 
FROM MHGROUP.CHECKOUT c JOIN 
    MHGROUP.DOCMASTER dm 
    ON c.docver = dm.docver 
WHERE c.CHECKOUT_DIR LIKE '%\0257\%'; 

編輯:

如由Jamie建議,最佳解決方案是:

SELECT * 
FROM MHGROUP.CHECKOUT c JOIN 
    MHGROUP.DOCMASTER dm 
    ON c.docnum = dm.docnum and c.version = dm.version 
WHERE c.CHECKOUT_DIR LIKE '%\0257\%'; 
+0

是這比'docnum = docnum和版本= version'任何不同? – JamieD77

+0

@ JamieD77。 。 。這是一個更好的解決方案。當我回答時,我實際上沒有注意到這兩個表達式的邏輯是相同的。我編輯了答案(儘管我會高興地提出你寫的答案)。 –

相關問題