SQL连接两个表,null结果相同

时间:2014-12-19 11:27:31

标签: sql sql-server inner-join

我正在尝试为已更新的字段创建报告,所以基本上是这样的:

| X | Y | Z | - Table 1 
| X | Y | P | - Table 2

| NUL | NUL | P | - Is what i want the outcome to be

有谁知道这是否可行/如何接近它?我对SQL不太称职! 欢呼声,

4 个答案:

答案 0 :(得分:1)

使用Left Outer Join获取结果

SELECT Table1.col1,
       Table1.col2,
       Table2.col3
FROM   Table2
       LEFT OUTER JOIN Table1
              ON Table2.col3 = Table1.col3 

SQL FIDDLE DEMO

答案 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 JOININNER 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列