Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 联接两个表以从表1中获取匹配的记录和不匹配的记录_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 联接两个表以从表1中获取匹配的记录和不匹配的记录

Sql server 联接两个表以从表1中获取匹配的记录和不匹配的记录,sql-server,sql-server-2012,Sql Server,Sql Server 2012,场景:我有两个表,即覆盖率和产品 覆盖率表: CId、CName、CType、CMessage、CDate、Coverage产品ID 产品表: PId、CName、CType、CMessage、PDate、Coverage产品ID 通过使用CoverageProductId,我关联了两个表 我需要从两个表中获得3列CName、CMessage和CoverageProductId 以下情况 如果两个表CoverageProductId匹配,则从Product表中获取3列值 如果两个表Covera

场景:我有两个表,即覆盖率和产品

覆盖率表: CId、CName、CType、CMessage、CDate、Coverage产品ID

产品表: PId、CName、CType、CMessage、PDate、Coverage产品ID

通过使用CoverageProductId,我关联了两个表

我需要从两个表中获得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

但是结果并不像预期的那样,它返回重复的值。

我认为这可能会满足您的要求:

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
中不匹配的所有行

下面是我的代码

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

请发布一些样本数据和预期结果。一个sql小提琴会更好。我认为你的条件的逻辑是扭曲的。您希望保留
覆盖范围中的记录,这些记录在
产品中既匹配又不匹配。这意味着您需要整个
Coverage
表。根据定义,此表还包含与
产品
匹配的所有记录。哎呀,我没有注意到您的答案。