[英]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 | HTable 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 | HTable 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 IN
或NOT EXISTS
。 一个示例可能是:
select * from a
where a.val not in (
select val
from b
where temp < 2
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.