SQL查询比较(ON子句或WHERE子句中的联接条件)

SQL查询比较(ON子句或WHERE子句中的联接条件),sql,database,oracle,join,left-join,Sql,Database,Oracle,Join,Left Join,基本上我的疑问是,如果我们在左外连接的ON子句中指定一个条件,或者在WHERE子句中使用null检查指定一个条件,这是相同的吗 表架构: 问题1 问题2 结果和可读性都不一样 当您在on子句中写入条件时,将包括应用程序中的所有行。 在where子句中写入条件时,从结果中筛选行: 在您的情况下,将筛选与b.STATUS='disabled'的App_子级相关行的App 以下是一个示例: INSERT INTO App VALUES(1,'active'); INSERT INTO App_Chi

基本上我的疑问是,如果我们在左外连接的ON子句中指定一个条件,或者在WHERE子句中使用null检查指定一个条件,这是相同的吗

表架构:

问题1

问题2


结果和可读性都不一样

当您在on子句中写入条件时,将包括应用程序中的所有行。 在where子句中写入条件时,从结果中筛选行: 在您的情况下,将筛选与b.STATUS='disabled'的App_子级相关行的App

以下是一个示例:

INSERT INTO App VALUES(1,'active');

INSERT INTO App_Child VALUES(3,'disabled',1);

SELECT a.ID AS appID, a.STATUS AS appSTATUS,
b.child_id AS acOWNID,b.STATUS AS acSTATUS, b.id AS acID
 FROM App  a LEFT OUTER JOIN App_Child b 
      ON (a.id=b.id AND b.STATUS <> 'disabled')  
WHERE a.ID = 1;

--- has results ---

SELECT a.ID AS appID, a.STATUS AS appSTATUS,
b.child_id AS acOWNID,b.STATUS AS acSTATUS, b.id AS acID
 FROM App  a LEFT OUTER JOIN App_Child b ON (a.id=b.id)  
WHERE a.ID = 1 AND (b.STATUS IS NULL OR b.STATUS<>'disabled');

-- don't has results --
SELECT a.ID AS appID, a.STATUS AS appSTATUS,
b.child_id AS acOWNID,b.STATUS AS acSTATUS, b.id AS acID
 FROM App  a LEFT OUTER JOIN App_Child b ON (a.id=b.id AND b.STATUS <> 'disabled')  WHERE a.ID = ?;
SELECT a.ID AS appID, a.STATUS AS appSTATUS,
b.child_id AS acOWNID,b.STATUS AS acSTATUS, b.id AS acID
 FROM App  a LEFT OUTER JOIN App_Child b ON (a.id=b.id)  WHERE a.ID = ? AND (b.STATUS IS NULL OR b.STATUS<>'disabled');
INSERT INTO App VALUES(1,'active');

INSERT INTO App_Child VALUES(3,'disabled',1);

SELECT a.ID AS appID, a.STATUS AS appSTATUS,
b.child_id AS acOWNID,b.STATUS AS acSTATUS, b.id AS acID
 FROM App  a LEFT OUTER JOIN App_Child b 
      ON (a.id=b.id AND b.STATUS <> 'disabled')  
WHERE a.ID = 1;

--- has results ---

SELECT a.ID AS appID, a.STATUS AS appSTATUS,
b.child_id AS acOWNID,b.STATUS AS acSTATUS, b.id AS acID
 FROM App  a LEFT OUTER JOIN App_Child b ON (a.id=b.id)  
WHERE a.ID = 1 AND (b.STATUS IS NULL OR b.STATUS<>'disabled');

-- don't has results --