如何在TSQL中反转我的连接标准?

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条.

那么我如何得到我正在寻找的结果呢?如果尚不清楚,则第一个查询的结果数+第二个查询的结果应该等于源表中的记录总数.

谢谢你的帮助!

Gio*_*sos 5

我想你需要这样的东西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)

上面的查询会得到一切从sourceserial/ trans对不符合之一匹配reference.

如在下面评论引述@丹NOT EXISTS一般具有性能优势LEFT JOIN在这样的情况下(参见为例).

  • AXMIM的LEFT JOIN解决方案可以使用,但NOT EXISTS应该可以更好地运行 (2认同)