Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle 标准外部左侧联接和使用选择联接之间的差异_Oracle_Select_Outer Join - Fatal编程技术网

Oracle 标准外部左侧联接和使用选择联接之间的差异

Oracle 标准外部左侧联接和使用选择联接之间的差异,oracle,select,outer-join,Oracle,Select,Outer Join,这两种说法有什么区别吗 -- Statement 1: SELECT * FROM Table1 t1 LEFT OUTER JOIN TABLE2 t2 on t1.id = t2.id 及 我不是专家,但语句2看起来像是写得很糟糕的sql,而且可能需要更长的时间。我正在尝试优化一个代码块,它有很多连接,就像第二个一样。它们在技术上是相同的吗?我可以用标准的join语句1替换它们吗 谢谢 注:这是甲骨文,正在处理1亿行 PSS。我正在做我自己的侦探工作,以找出它们是否相同,以

这两种说法有什么区别吗

 -- Statement 1:
 SELECT *
 FROM Table1 t1
     LEFT OUTER JOIN TABLE2 t2 on t1.id = t2.id

我不是专家,但语句2看起来像是写得很糟糕的sql,而且可能需要更长的时间。我正在尝试优化一个代码块,它有很多连接,就像第二个一样。它们在技术上是相同的吗?我可以用标准的join语句1替换它们吗

谢谢

注:这是甲骨文,正在处理1亿行


PSS。我正在做我自己的侦探工作,以找出它们是否相同,以及时间上的差异,希望专家能够解释是否存在技术上的差异

它们不是相同的查询,子查询中缺少一个条件,该条件取决于子查询中是否涉及
表2
的所有列和所有列名。如果子查询涉及选择列表中
表2
的所有列名,则它们是相同的查询,不需要子查询。对于子查询,我指的是在parens中join语句之后带有select语句的部分

第一种方法使用
表2
及其所有列,所有这些列都将在满足标准的结果集中可用

然而,在第二个表中,使
联接的表不是您的
表2
,而是一个表,其中只包含子查询的
选择列表中指定的
表2
中的列,即
id
a
b
c
。但它将拥有此子查询之后的所有行,因为子查询中的
WHERE
子句没有对其强制任何条件

您将拥有相同数量的行,其中只有选定的列参与了
表2


第二个不一定是写得很差的。在将
加入
表2

之前,您可能需要满足一个条件。如果表2的列数超过4列,则语句2仅用于限制结果集。数据越少加载越快。解释计划是您的朋友。@DVJex:第二个计划仅限制列数,而不限制行数。第二个查询相当于
SELECT t1.*,t2.id,t2.a,t2.b,表1中的t2.c t1左外部联接表2 t2 on t1.id=t2.id
如果这些都是表2的列,那么两个查询都是100%相同的,Oracle几乎肯定会对这两个查询使用相同的执行计划。非常有趣,谢谢。听起来它们是不同的,因为一条语句可以访问表2中的所有列,而语句2只能访问id、a、b和c列。第二个是子查询这一事实会给查询增加时间吗,还是不会?我想我得做个实验,看看其中一个是否比另一个快。谢谢@我不确定如果你使用子查询是否会增加额外的延迟。但是,由于子查询中没有条件,
where
子句,因此可以完全忽略它。如果您想授予访问权限,或者只显示
表2
中的一些列,只需将这些列放在第一个
选择
列表中,如下所示:
从表1中选择t1.*,t2.id,t2.a,t2.b,t3.c在t1.id=t2.id
上左外连接表2 t2。您不需要对此进行子查询。
  -- Statement 2:
  SELECT *
  FROM Table1 t1
     LEFT OUTER JOIN (SELECT id, a, b, c FROM Table2) t2 on t1.id = t2.id