繁体   English   中英

SQL:左联接排除基于另一个表的值

[英]Sql : left join exclude values based on another table

我试图弄清楚这一点,但没有成功,我曾尝试过几篇文章,但无法解决。 情况是这样的:(有没有外键约束) 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
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
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中,所以它已包含在result中。 但是我想如果val b <2,那么它不应该包含在结果中。

如果要从第二个表中排除结果,请不要使用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

在查询中添加以下WHERE子句

WHERE B.Val IS NOT NULL

我认为这是您要寻找的:

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。 您可能需要查看此链接以获取有关外部联接的更多信息: “ INNER JOIN”和“ OUTER JOIN”之间有什么区别?

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

获得结果的另一种选择可能只是使用NOT INNOT EXISTS 一个示例可能是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM