加入两个表以获得表1中的匹配记录和不匹配的记录

时间:2015-07-31 02:51:38

标签: sql-server sql-server-2012

场景:我有2个表,即Coverage和Product

覆盖表: CID,CNAME,CTYPE,的CMessage,CDATE,CoverageProductId

产品表: PID,CNAME CTYPE,的CMessage,PDATE,CoverageProductId

通过使用CoverageProductId我将关联2个表。

我需要从两个表中获得3列CName,CMessage和CoverageProductId

下面的条件,

  • 如果两个表CoverageProductId匹配,则从Product表中获取3列值。
  • 如果两个表CoverageProductId不匹配,则从Coverage表中获取3列值。

我的查询在MS sql server

下面
SELECT Distinct C.CoverageProductID
,C.CName
,C.CType
FROM Coverage C
INNER JOIN Product P
ON C.CoverageProductID!=P.CoverageProductID
UNION
SELECT Distinct P.CoverageProductID
,P.CName
,P.CType
FROM Coverage C
INNER JOIN Product P
ON C.CoverageProductID=P.CoverageProductID

但结果不符合预期,并返回重复值。

2 个答案:

答案 0 :(得分:2)

我认为这可能会做你想要的:

select P.CoverageProductID, P.CName, P.CType
from Product P
where exists (select 1
              from coverage c
              where p.CoverageProductID = c.CoverageProductID)
union all
select C.CoverageProductID, C.CName, C.CType
from Coverage C
where not exists (select 1
                  from product p
                  where p.CoverageProductID = c.CoverageProductID);

它会获取Product中匹配Coverage的所有行,然后来自Coverage的所有行Product中不匹配。

答案 1 :(得分:0)

我尝试过更好的方法进行同样的查询,

以下是我的代码,

SELECT 
ISNULL(P.CoverageProductID,C.CoverageProductID),
ISNULL(P.CType,C.CType)
ISNULL(P.CName,C.CName)
FROM   Coverage AS C
           LEFT OUTER JOIN
           Product AS P
           ON C.CoverageProductID = P.CoverageProductID