如何加入或比较 SQL 服务器中的计算列?

How do I Join or compare to calculated columns in SQL Server?

我想加入 On 或 Select In 以仅查找在 DOC_VER 列上的两个 table 之间匹配的行。

查询 A 中的 table 没有作者值,这就是为什么我必须连接 table 进行比较的原因。

查询 A:

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

结果A:

DOC_VER     DOCNUM  VERSION CHECKOUT_DIR
--------------------------------------------------------------------------
4246295_10  4246295 10      C:\NrPortbl\ATL_IMANAGE5746295_10.DOC
6376084_19  6376084 19      C:\NrPortbl\DMSLIBRARY015776084_19.DOC

查询 B:

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

结果 B:

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

您可以在 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 '%57\%';

但是,如果这是您经常做的事情,我会推荐计算列,也许还有索引:

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 '%57\%';

编辑:

根据 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 '%57\%';