2016-07-04 42 views
0

我有两个相同列的表,我需要在这两个表中做出选择,我想知道如何做到这一点的最佳方式,我的选择测试是:执行从同一列的两个表中选择

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 

这是可能的吗?

如何执行这种选择的更好的方法,如果没有找到一个表中的值,该值将在其他表....

------编辑

也许创建一个视图是这种选择的一个很好的选择?

+2

您确定需要笛卡尔产品吗? –

+1

你能展示预期的结果吗? –

回答

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

0

我相信这是要回报你什么叫做笛卡尔乘积。这是开放式加入的结果,就像你上面那样。该查询将返回TONS记录,因为您没有指定如何连接两个表,它只会盲目地尝试匹配列。至少,在JOIN中添加一个ON条件,以便您可以匹配ID /键。我想你想要的是一个IN的INNER JOIN;这将根据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将返回的值,它会使用从TBL 1的值,除非它为空,那么将使用值从TBL2。

编辑:我知道如果指定了WHERE,CROSS JOIN变成了INNER JOIN,但是WHERE是否需要包含这两个表?我觉得Expr1 = 500仍然会产生笛卡儿积;有人能纠正我吗?

相关问题