我有两个具有相同列的表,我需要在这两个表中进行select,我想知道如何才是最好的方法,我的select测试是:
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这是可能的吗?
如何更好地执行这种select,如果在一个表中找不到值,该值将在另一个表中...
-编辑
也许创建一个视图是这种select类型的一个很好的替代方案?
发布于 2016-07-05 04:21:55
我相信这会给你带来所谓的笛卡尔乘积。它是开放连接的结果,就像上面的一样。该查询将返回大量记录,因为您没有指定如何连接这两个表,它只是盲目地尝试匹配列。至少,将ON条件添加到连接中,以便可以匹配ID/键。我认为您需要的是一个带有on的内连接;这将根据ID/键返回所有匹配的行。
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,交叉连接就会变成内连接,但是WHERE需要包含这两个表吗?我觉得Expr1 = 500仍然会产生笛卡尔乘积;有人能纠正我吗?
https://stackoverflow.com/questions/38191310
复制相似问题