Sql server 联接两个表以从表1中获取匹配的记录和不匹配的记录
场景:我有两个表,即覆盖率和产品 覆盖率表: CId、CName、CType、CMessage、CDate、Coverage产品ID 产品表: PId、CName、CType、CMessage、PDate、Coverage产品ID 通过使用CoverageProductId,我关联了两个表 我需要从两个表中获得3列CName、CMessage和CoverageProductId 以下情况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
- 如果两个表CoverageProductId匹配,则从Product表中获取3列值
- 如果两个表CoverageProductId不匹配,则从Coverage表中获取3列值
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
表。根据定义,此表还包含与产品
匹配的所有记录。哎呀,我没有注意到您的答案。