从具有相同列的两个表中执行选择

时间:2016-07-04 19:40:41

标签: sql sql-server

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

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 个答案:

答案 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仍会产生笛卡尔积;有人可以纠正我吗?