使用UNION条件进行SQL查询比较
在同事们的帮助下,我编译了以下sql代码,以比较和删除出现在两个表中的记录使用UNION条件进行SQL查询比较,sql,sql-server,Sql,Sql Server,在同事们的帮助下,我编译了以下sql代码,以比较和删除出现在两个表中的记录 WITH cmn AS ( SELECT a.CDC_TYPE FROM tabled a INNER JOIN tablee b ON a.COUNTRY_ID = b.COUNTRY_ID AND a.PK_LOYALTYACCOUNT = b.PK_LOYALTYACCOUNT AND a.
WITH cmn AS
(
SELECT a.CDC_TYPE
FROM tabled a
INNER JOIN tablee b ON a.COUNTRY_ID = b.COUNTRY_ID
AND a.PK_LOYALTYACCOUNT = b.PK_LOYALTYACCOUNT
AND a.CDC_TYPE = 'U'
)
SELECT
1 AS is_deleted,
a.*
FROM
tabled a
INNER JOIN
cmn ON a.CDC_TYPE = cmn.CDC_TYPE
UNION ALL
SELECT
0 AS is_deleted,
b.*
FROM
tablee b
INNER JOIN
cmn ON b.CDC_TYPE = cmn.CDC_TYPE
示例数据来自下表:
查询的预期结果应该如下所示:
但是,输出如下所示:
有人能告诉我哪里出了问题吗
谢谢您应该将查询写为:
; with cmn as
( SELECT a.CDC_TYPE,
a. PK_LOYALTYACCOUNT, --Add these also in CTE result set
a.COUNTRY_ID --Add these also in CTE result set
FROM a
INNER JOIN b
ON a.COUNTRY_ID = b.COUNTRY_ID
AND a.PK_LOYALTYACCOUNT = b.PK_LOYALTYACCOUNT
AND a.CDC_TYPE = 'U'
)
SELECT 1 AS is_deleted,
a.*
FROM a
INNER JOIN cmn
ON a.CDC_TYPE = cmn.CDC_TYPE
and a.COUNTRY_ID = cmn.COUNTRY_ID
AND a.PK_LOYALTYACCOUNT = cmn.PK_LOYALTYACCOUNT
UNION ALL
SELECT 0 AS is_deleted,
b.*
FROM b
INNER JOIN cmn
ON b.CDC_TYPE = cmn.CDC_TYPE
and b.COUNTRY_ID = cmn.COUNTRY_ID
AND b.PK_LOYALTYACCOUNT = cmn.PK_LOYALTYACCOUNT
当您仅从CTE返回CDC_类型“U”并再次将该值与表a和表b联接时,它实际上会分别与表a和表b的所有行相乘,因为它们都符合条件a.CDC_类型=cmn.CDC_类型。为了避免获得所有结果,您应该在CTE结果集中包括PK_忠诚度帐户和国家ID。
连接条件在a.CDC_TYPE=cmn.CDC_TYPE=>U'='U'=>交叉连接上没有任何意义我得到了以下错误:无效的对象名'a'选择a.CDC_类型,-我应该说我是一个新手。我粘贴了你的脚本,完全一样,但我一直得到相同的错误:Deepshikha,我很傻,我将这些表插入到代码中,它工作得很好。谢谢你,最后一个相关问题。目前,记录基于CDC_类型为“U”。如果CDC_类型等于'U'或'D',是否有任何简单的代码修改来获得相同的结果?而不仅仅是“U”?再次感谢您的帮助,查询不会将自身限制为属性CDC_TYPE中的值。表a和表b中CDC_类型、PK_忠诚度账户和国家ID相同的所有记录将与表a中的记录一起出现,表b中的1已删除,0已删除。