Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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 如果表被联接,Where语句是否重要?_Sql_Oracle - Fatal编程技术网

Sql 如果表被联接,Where语句是否重要?

Sql 如果表被联接,Where语句是否重要?,sql,oracle,Sql,Oracle,我想知道两个查询是否总是返回相同的结果。他们平等吗 SELECT OT_ACC_NO , ACC_NO FROM ACCOUNTS JOIN OTHER_TABLE ON OT_ACC_NO = ACC_NO WHERE ACC_NO IS NOT NULL SELECT OT_ACC_NO , ACC_NO FROM ACCOUNTS JOIN OTHER_TABLE ON OT_ACC_NO = ACC_NO WHERE OT_ACC_NO IS NOT NULL 这种情况下,条件不会

我想知道两个查询是否总是返回相同的结果。他们平等吗

SELECT OT_ACC_NO , ACC_NO FROM ACCOUNTS
JOIN OTHER_TABLE ON OT_ACC_NO = ACC_NO
WHERE ACC_NO IS NOT NULL 

SELECT OT_ACC_NO , ACC_NO FROM ACCOUNTS
JOIN OTHER_TABLE ON OT_ACC_NO = ACC_NO
WHERE OT_ACC_NO IS NOT NULL

这种情况下,条件不会产生任何逻辑影响


内部联接确保两个表中都必须存在记录,并且记录不能为空值。

此条件不会产生任何逻辑影响


内部联接确保两个表中都必须存在记录,并且它们不能为空值。

这两个表是等效的。也许更令人惊讶的是,
WHERE
子句是不必要的。因此,这相当于:

SELECT OT_ACC_NO, ACC_NO
FROM ACCOUNTS JOIN
     OTHER_TABLE
     ON OT_ACC_NO = ACC_NO;
为什么??因为
内部联接
仅在
开启
条件为真时才返回行。如果任一值为
NULL
,则比较返回
NULL
,该值被视为false


我应该注意到,虽然最终结果是相同的,但查询的执行计划可能不一样。

这两者是等效的。也许更令人惊讶的是,
WHERE
子句是不必要的。因此,这相当于:

SELECT OT_ACC_NO, ACC_NO
FROM ACCOUNTS JOIN
     OTHER_TABLE
     ON OT_ACC_NO = ACC_NO;
为什么??因为
内部联接
仅在
开启
条件为真时才返回行。如果任一值为
NULL
,则比较返回
NULL
,该值被视为false


我应该注意的是,虽然最终结果是相同的,但是查询的执行计划可能不一样。

让我们向后退一小步,考虑等式运算符和<代码> null <代码>值:

SELECT CASE WHEN NULL = NULL THEN 'Equal' ELSE 'Not Equal' END FROM DUAL;
现在,对于一些人来说,令人惊讶的是,这将返回不相等的

如果你考虑<代码> null <代码>代表一个未知的值,那么你会问一个未知值是否等于另一个未知值,答案是错误的。 对于您的查询:

SELECT OT_ACC_NO,
       ACC_NO
FROM   ACCOUNTS
       JOIN OTHER_TABLE
       ON OT_ACC_NO = ACC_NO
OT_ACC_NO=ACC_NO
时,这将连接表,正如我们上面看到的,如果这些变量中的任何一个为
NULL
(未知),则相等性比较的结果将始终为false,并且将从连接结果中排除行


< P> >,添加WHERE子句,以测试是否<代码> OtthAccoNo.< /代码>或<代码> ACCYNO./COD> <代码> null <代码>将不会排除任何行,因为它们将已经被联接条件排除。

让我们向后退一小步,考虑等式运算符和<代码> null < /Calp>值:

SELECT CASE WHEN NULL = NULL THEN 'Equal' ELSE 'Not Equal' END FROM DUAL;
现在,对于一些人来说,令人惊讶的是,这将返回不相等的

如果你考虑<代码> null <代码>代表一个未知的值,那么你会问一个未知值是否等于另一个未知值,答案是错误的。 对于您的查询:

SELECT OT_ACC_NO,
       ACC_NO
FROM   ACCOUNTS
       JOIN OTHER_TABLE
       ON OT_ACC_NO = ACC_NO
OT_ACC_NO=ACC_NO
时,这将连接表,正如我们上面看到的,如果这些变量中的任何一个为
NULL
(未知),则相等性比较的结果将始终为false,并且将从连接结果中排除行


因此,添加where子句来测试
OT\u ACC\u NO
ACC\u NO
是否为
NULL
永远不会排除任何行,因为它们已经被连接条件排除了。

这个问题被标记为
Oracle
,因此答案应该以某种方式谨慎,没有逻辑影响的主题,结果相同

下面是示例数据,用于秒查询未返回任何数据,但第一次查询失败,出现
ORA-01722:无效数字

create table ACCOUNTS as
select '1-1'  ACC_NO from dual;


create table OTHER_TABLE as
select cast(null as number) OT_ACC_NO from dual;

这个问题标有
Oracle
,所以答案应该是谨慎的,没有逻辑上的影响,相同的结果

下面是示例数据,用于秒查询未返回任何数据,但第一次查询失败,出现
ORA-01722:无效数字

create table ACCOUNTS as
select '1-1'  ACC_NO from dual;


create table OTHER_TABLE as
select cast(null as number) OT_ACC_NO from dual;

Just
JOIN
equals
internaljoin
-()Just
JOIN
equals
internaljoin
-()