如何连接两个表,但只返回与特定列不匹配的行,包括NULL?

时间:2017-11-16 07:49:15

标签: mysql compare match

我有两个看起来像这样的表:

T1:  ID  |  oldID

T2:  ID  |  newID

我基本上需要在ID匹配时加入这些表。但是,我只想返回如下结果:ID | oldID | newID,其中oldID不等于newID。

示例数据:

T1: 1 | 100 2 | NULL 3 | 200 4 | 500

T2: 1 | NULL 2 | 300 3 | 200 4 | 400

我的预期结果:

T3: 1 | 100 | NULL 2 | NULL | 300 4 | 500 | 400

有人能指出我走在正确的轨道上吗?

3 个答案:

答案 0 :(得分:0)

对于SQL Server

SELECT  T1.ID ,T1.oldID,T2.[newID]
FROM    T1
INNER JOIN T2   ON  T1.ID = T2.ID AND   ISNULL(T1.oldID,0) <> ISNULL(T2.[newID],0)

对于MySql,请使用IFNULL代替ISNULL

如果零(0)是oldIDnewID中的值,则可以使用ISNULL函数的任何其他未使用值(即-1

答案 1 :(得分:0)

试试这个答案,希望这有帮助

var yourObject = new YourObject {
    Email = "email",
    Password = "password"
};
string s = client.UploadString("http://localhost:1111/Service.svc/SignIn","POST", JsonConvert.SerializeObject(yourObject));

答案 2 :(得分:0)

select t1.ID,t1.oldID,t2.NewId
FROM T1 t1, T2 t2 
WHERE t1.ID=t2.ID 
AND COALESCE(t1.oldID,0) <> COALESCE(t2.NewId,0)

说明

select t1.ID,t1.oldID,t2.NewId
FROM T1 t1, T2 t2 
WHERE t1.ID=t2.ID #IDs are equal in two tables
AND t1.oldID <> t2.NewId 

Result is:
# ID, oldID, NewId
'4', '500', '400'

如果您这样检查,您将无法获得预期的结果,原因是NULL值未得到正确处理。 但是如果您使用COALESE意味着它将检查如下:

COALESCE(值1,值2,值3,...)

以上语法等同于以下IF-THEN-ELSE语句

IF value1 is not NULL THEN
 result = value1;
ELSIF value2 is not NULL THEN
 result = value2;
ELSIF value3 is not NULL THEN
 result = value3;
ELSE
 result = NULL;
END IF;   

实施例: SELECT COALESCE(NULL,2,3);返回2

所以在我们的Query中,如果t1.oldID为null,COALESCE(t1.oldID,0)将返回0 ..

select t1.ID,t1.oldID,t2.NewId
FROM T1 t1, T2 t2 
WHERE t1.ID=t2.ID 
AND COALESCE(t1.oldID,0) <> COALESCE(t2.NewId,0)