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;
JustJOIN
equalsinternaljoin
-()JustJOIN
equalsinternaljoin
-()