Sql:左连接根据另一个表排除值

时间:2014-05-14 01:23:44

标签: sql sql-server

我试图弄清楚这一点没有任何成功我尝试过几个帖子但是无法找到解决方案。情况是这样的:(没有外键约束) Table A ID | VAL Table B ID|VAL|TEMP RESULT REQUIRED
1 | A 1| A | 2 A 1 | B 1| A | 2 C 1 | C 1| B | 1 D 1 | D 1| C | 2 E 1 | E 1| D | 2 F 1 | F 1| G | 6 H 1 | H
当我运行时SELECT DISTINCT A.VAL,B.TEMP FROM A LEFT JOIN B ON A.VAL=B.VAL AND B.TEMP > 1 这将返回表A中的所有行和表B中常见但未验证条件的行(b.val> 1),因为行B在表A中,它被包含在结果中。但是我希望如果val b< 2然后它不应包括在结果中。

3 个答案:

答案 0 :(得分:0)

如果要从第二个表中排除结果,请不要使用left outer join。只需使用inner join

SELECT DISTINCT A.VAL, B.TEMP
FROM A INNER JOIN
     B 
     ON A.VAL = B.VAL AND B.TEMP > 1;

或者,在您的情况下,您可能需要B.TEMP < 2

答案 1 :(得分:0)

在查询中添加以下WHERE子句

WHERE B.Val IS NOT NULL

答案 2 :(得分:0)

我认为这就是你要找的东西:

select distinct a.val
from a
left outer join b on (a.val = b.val)
where 
  (b.temp > 1 or b.val is null)

您希望在执行外部联接后对B.TEMP执行测试。在where子句中,您正在测试两件事。首先,检查TEMP的值是否大于1.这是问题中提出的条件。第二个条件(b.val is null)涵盖表A中那些在表B中没有对应行的行。例如,表A中的行'E','F'和'G'不匹配对于表B中的任何内容,因此在外部联接之后,B的所有列都将为null。您可能需要查看此链接以获取有关外连接的更多信息:What is the difference between "INNER JOIN" and "OUTER JOIN"?

但是,我注意到表B中的行不需要是唯一的。你有两行,其中VAL ='A'。如果TEMP列具有不同的值,其中一个满足条件而另一个不满足,则会发生什么。

获得结果的另一个选择可能就是使用NOT INNOT EXISTS。一个例子可能是:

select * from a
where a.val not in (
  select val 
  from b 
  where temp < 2
);