int*_*ntA 1 sql t-sql sql-server join criteria
我认为这是SQL中相对基本的操作,但我很难搞清楚.
我有两个表,一个源表我正在尝试从中选择数据,一个包含序列#和事务#的引用表(源表也有这些列,等等).我想做两个不同的SELECT,一个是源表中存在串行/反转编号对,另一个是串行/反转编号不存在的SELECT.(串行号和反向号的组合是这两个表的主键)
最初我通过这样的连接来做这件事:
SELECT * FROM source s
INNER JOIN reference r ON s.serial = r.serial AND s.trans = r.trans
Run Code Online (Sandbox Code Playgroud)
我认为这应该给我从源表中的所有内容,它具有与引用表中的一个匹配的串/反对.我不肯定这是正确的,但它返回了合理数量的结果,我认为它看起来不错.
当我去做相反的事情时,从串口/反转对不匹配的源获取一切参考,我遇到问题.我尝试了以下查询:
SELECT * FROM source s
INNER JOIN reference r ON s.serial <> r.serial AND s.trans <> r.trans
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时,查询将继续进行,它开始返回的结果比它应该的结果多,实际上在整个源表中.它最终以OOM异常结束,我让它运行20分钟+.对于一些persepctive我正在处理的源表有大约1300万条记录,参考表大约有105,000条.
那么我如何得到我正在寻找的结果呢?如果尚不清楚,则第一个查询的结果数+第二个查询的结果应该等于源表中的记录总数.
谢谢你的帮助!
我想你需要这样的东西NOT EXISTS:
SELECT *
FROM source s
WHERE NOT EXISTS (SELECT 1
FROM reference r
WHERE s.serial = r.serial AND s.trans = r.trans)
Run Code Online (Sandbox Code Playgroud)
上面的查询会得到一切从source在serial/ trans对不符合之一匹配reference.
如在下面评论引述@丹NOT EXISTS一般具有性能优势LEFT JOIN在这样的情况下(参见本为例).