内部联接在null条件:bug或功能?

时间:2015-10-16 09:17:03

标签: mysql sql join

以下是测试设置:

CREATE TABLE A (
    id bigint NOT NULL AUTO_INCREMENT,
    value bigint,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO A (id, value) VALUES (1, 22);
INSERT INTO A (id, value) VALUES (2, 25);
INSERT INTO A (id, value) VALUES (3, 25);

CREATE TABLE B (
    id bigint NOT NULL AUTO_INCREMENT, 
    value bigint, 
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

重要提示:表B不包含任何行!!!

测试查询:

select * from A  inner join B on (A.value=25 OR B.value=null);

惊喜:提取空结果集

如果表B包含以下内容:

INSERT INTO B (id, value) VALUES (3, 66);

然后相同的查询将返回2行:

id  value  id  value  
--  -----  --  -----  
2   25     3   66     
3   25     3   66     

这是MySQL的错误或功能吗?

1 个答案:

答案 0 :(得分:1)

INNER JOIN按定义仅返回匹配的记录。如果表没有任何记录,则不能有任何记录记录。这是所有RDBM的标准行为。如果要从表中返回行而不管来自另一个行的匹配行,请使用向左或向右连接而不是内部。

List<Employee> employees=Employee.createCriteria().list{
    'address'{
         eq('city',params.city)
     }

}

此外,任何= NULL比较总是会返回false,因为NULL不等于任何东西,甚至不等于另一个NULL值。如果要测试字段的值是否为NULL,则使用fieldname IS NULL表达式。