Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有异或的左联接表_Sql_Sql Server_Left Join - Fatal编程技术网

Sql 具有异或的左联接表

Sql 具有异或的左联接表,sql,sql-server,left-join,Sql,Sql Server,Left Join,是否有一种方法可以在一种且仅在一种可能的条件下将两个表连接在一起?在条件“a”或“b”下加入可以复制行,但我只希望加入一次。我提出了一个可能的解决方案,但我想知道是否有更巧妙的方法来解决这个问题 例如: SELECT * FROM TableA a LEFT JOIN TableB b ON a.col1 = b.col1 OR (a.col1 != b.col1 AND a.col2 = b.col2) 这将连接col1或col2上的表,但不能同时连接这两个表。有更干净的方法

是否有一种方法可以在一种且仅在一种可能的条件下将两个表连接在一起?在条件“a”或“b”下加入可以复制行,但我只希望加入一次。我提出了一个可能的解决方案,但我想知道是否有更巧妙的方法来解决这个问题

例如:

SELECT *
FROM TableA a
LEFT JOIN TableB b
    ON a.col1 = b.col1
    OR (a.col1 != b.col1 AND a.col2 = b.col2)

这将连接col1或col2上的表,但不能同时连接这两个表。有更干净的方法吗?

不是更有效,但我认为更清楚

SELECT *
FROM TableA a
LEFT JOIN TableB b
  ON     (a.col1 = b.col1 or  a.col2 = b.col2)
 AND NOT (a.col1 = b.col1 and a.col2 = b.col2)

你的方法有效。如果您只需要
b
中的一列(或少数),我建议您:

SELECT a.*, COALESCE(b.col3, b2.col3)
FROM TableA a LEFT JOIN
     TableB b
     ON a.col1 = b.col1 LEFT JOIN
     TableB b2
     ON a.col1 <> b2.col1 AND a.col2 = b2.col2;
选择一个*,合并(b.col3,b2.col3)
从表a左连接
表b
关于a.col1=b.col1左连接
表B b2
关于a.col1 b2.col1和a.col2=b2.col2;

连接
条件中删除
可以让优化器生成更好的执行计划。

显示示例数据和期望的结果…如果它对您有效(返回期望的结果),那么我会坚持使用它,因为一年后您阅读此代码时,您将有更好的机会理解它。请记住,优化器可以用不同的方式重写查询以获得相同的结果。因此,如果“光滑”是它看起来的样子,并且不是由性能驱动的,我不确定是否有很大的改进空间。可能重复我当前的一般评论,如“更好”/“最好”等:在工程中没有“更好”/“最好”这样的东西,除非你定义它。同样不幸的是,所有合理的实用定义都需要大量的经验,其中包含大量的因素,这些因素与对细节的敏感度混乱相互作用。做简单的设计。当你通过测量证明一个设计和你能想到的所有备选方案都有问题(无论当时是什么意思),然后问一个非常具体的问题。还应定义“更好”/“最佳”。这还不清楚。它的措辞也很奇怪——根据一些奇怪的心理模型。你有1个加入。“在一个且仅在一个可能的条件下”、“可以复制行”和“只希望连接一次”是什么意思?您的测试意味着
a.col1=b.col1或a.col2=b.col2
——更简单。“在col1或col2上,但不是同时在col2上”是什么意思?你是说,正好是1个等式?这是
a.col1=b.col1和a.col2b.col2或a.col1b.col1和a.col2=b.col2
。如果您想了解性能编码,请阅读手册“重新索引和优化”中的所有内容。还有pdf格式的在线免费书籍。等等,
和!(表达式)
不是有效的SQL Server语法。它必须是
而不是(expression)