我有两个具有相同列的表,我需要在这两个表中进行选择,我想知道如何做到这一点的最佳方法,我的选择测试是:
SELECT
ISNULL(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1,
ISNULL(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2,
ISNULL(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3,
ISNULL(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4,
ISNULL(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5
FROM
LoteDet
CROSS JOIN
LoteDetPg
WHERE
Expr1 = 500
有可能做到这一点吗?
如何更好地执行这种选择,如果没有找到一个表中的值,该值将在另一个表中....
------编辑
也许创建一个视图是这种类型选择的一个很好的替代方案?
答案 0 :(得分:0)
使用COALESCE:
SELECT
COALESCE(LoteDet.IdLoteDet, LoteDetPg.IdLoteDet) AS Expr1,
COALESCE(LoteDet.IDSac, LoteDetPg.IDSac) AS Expr2,
COALESCE(LoteDet.Comprom, LoteDetPg.Comprom) AS Expr3,
COALESCE(LoteDet.NossoNum, LoteDetPg.NossoNum) AS Expr4,
COALESCE(LoteDet.NossoNumDig, LoteDetPg.NossoNumDig) AS Expr5
FROM
LoteDet
CROSS JOIN
LoteDetPg
WHERE
Expr1 = 500
请查看此文档:https://msdn.microsoft.com/pt-br/library/ms190349.aspx
答案 1 :(得分:0)
我相信这会让你回归所谓的笛卡尔积。这是开放式连接的结果,就像你上面一样。该查询将返回TONS记录,因为您没有指定如何加入这两个表,它只是盲目地尝试匹配列。至少,为JOIN添加一个ON条件,以便您可以匹配ID /键。我想你想要的是INNER JOIN和ON;这将根据ID / Key返回所有匹配的行。
SELECT
CASE WHEN tbl1.Comprom IS NULL THEN tbl2.Comprom ELSE tbl1.Comprom END AS Expr1
CASE WHEN tbl1.Nossonum IS NULL THEN tbl2.Nossonum ELSE tbl1.Nossonum END AS Expr2
FROM
tbl1 --LoteDet
INNER JOIN tbl2 --LoteDetPg
ON (tbl1.ID = tbl2.ID)
WHERE
Expr1 = 500 --I know I swapped the expression values, use whichever expression you need here
现在,只有具有匹配ID的行才会返回值,并且它将使用tbl1中的值,除非它为null,然后它将使用tbl2中的值。
编辑:我知道如果指定了WHERE,CROSS JOIN会变成INNER JOIN,但是WHERE是否需要包含这两个表?我觉得Expr1 = 500仍会产生笛卡尔积;有人可以纠正我吗?