如何加入或比较 SQL 服务器中的计算列?
How do I Join or compare to calculated columns in SQL Server?
我想加入 On 或 Select In 以仅查找在 DOC_VER 列上的两个 table 之间匹配的行。
- 查询 A 确定特定用户 ID 下的所有签出文档。
- 查询 B 确定哪些签出文档具有特定作者。
查询 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\%';
我想加入 On 或 Select In 以仅查找在 DOC_VER 列上的两个 table 之间匹配的行。
- 查询 A 确定特定用户 ID 下的所有签出文档。
- 查询 B 确定哪些签出文档具有特定作者。
查询 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\%';