2016-07-07 46 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。 。 。这是一个更好的解决方案。当我回答时,我实际上没有注意到这两个表达式的逻辑是相同的。我编辑了答案(尽管我会高兴地提出你写的答案)。 –

相关问题