我正在尝试为已更新的字段创建报告,所以基本上是这样的:
| X | Y | Z | - Table 1
| X | Y | P | - Table 2
| NUL | NUL | P | - Is what i want the outcome to be
有谁知道这是否可行/如何接近它?我对SQL不太称职! 欢呼声,
答案 0 :(得分:1)
使用Left Outer Join
获取结果
SELECT Table1.col1,
Table1.col2,
Table2.col3
FROM Table2
LEFT OUTER JOIN Table1
ON Table2.col3 = Table1.col3
答案 1 :(得分:1)
这是一个简单但类型密集的解决方案:
SELECT
CASE WHEN (
T1.Field1 = T2.Field1 OR (T1.Field1 IS NULL AND T2.Field1 IS NULL)
) THEN NULL ELSE T2.Field1 END AS Field1,
CASE WHEN (
T1.Field2 = T2.Field2 OR (T1.Field2 IS NULL AND T2.Field2 IS NULL)
) THEN NULL ELSE T2.Field1 END AS Field2
/** and so on **/
FROM
Table1 T1
FULL OUTER JOIN Table2 T2
ON T1.JoinField = T2.JoinField
您必须从两个表中单独比较每个字段。您可以使用FULL OUTER JOIN
从每个表中获取所有记录
此外,您还必须检查每个表中的值是否为NULL(T1.Field1 IS NULL AND T2.Field2 IS NULL
)。记住NULL永远不等于任何值都不是NULL。
注意:FULL OUTER JOIN
可能过于宽泛,因此您可以使用LEFT/RIGHT OUTER JOIN
或INNER JOIN
,但您必须选择加入以符合业务要求。
答案 2 :(得分:1)
如果您不知道哪些字段匹配,那么您就遇到了问题。如果您有匹配的id
,那么您可以使用full outer join
。这种情况下的典型查询如下:
select id,
(case when told.id is null then 'NEW'
when tnew.id is null then 'DELETED'
else 'UPDATED'
end) as what,
(case when told.col1 = tnew.col1 or told.col1 is null and tnew.col1 is null then NULL
else tnew.col1
end) as new_col1,
(case when told.col2 = tnew.col2 or told.col2 is null and tnew.col2 is null then NULL
else tnew.col2
end) as new_col2,
(case when told.col3 = tnew.col3 or told.col3 is null and tnew.col3 is null then NULL
else tnew.col3
end) as new_col3
from tableold told full outer join
tablenew tnew
on told.id = tnew.id;
这可能是你想要的,除非你的两个表只有一行。
答案 3 :(得分:0)
HEre是我的解决方案
CREATE TABLE #Temp1( A varchar(10), B varchar(10), C varchar(10) , ID Int )
CREATE TABLE #Temp2( A varchar(10), B varchar(10), C varchar(10) , ID Int )
INSERT INTO #Temp1 VALUES('X','Y','Z',1)
INSERT INTO #Temp2 VALUES('X','Y','P',1)
SELECT
CASE #Temp1.A WHEN #Temp2.A THEN NULL ELSE #TEmp2.A END as A,
CASE #Temp1.B WHEN #Temp2.B THEN NULL ELSE #TEmp2.B END as B,
CASE #Temp1.C WHEN #Temp2.C THEN NULL ELSE #TEmp2.C END as C
FROM #Temp1 full outer join #Temp2 on #Temp1.ID = #Temp2.ID
对每列使用一个案例,如果#temp1中的列A与#Temp2中的列b匹配则它将打印为null,否则将打印#Temp2列