2013-01-09 63 views
1

SQL fiddle link for sample dataSQL查询比较

基本上我的疑问是(在ON子句或WHERE子句中连接条件),如果我们指定一个条件对LEFT OUTER的条款JOIN或我们指定的条件是相同的在哪里有子句用空检查?

表架构:

Create table App(ID number , STATUS varchar2(10)); 
Create table App_Child(child_id number , 
         STATUS varchar2(10), 
         ID number); 

查询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 = ?; 

查询2

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'); 

回答

2

不是不相同NEI其结果和可读性

  • 当您在on子句中编写条件时,您将包含App中的所有行。
  • 当你写在where子句条件从结果过滤行:

在你的情况的App具有行与b.STATUS一个App_Child相关=“禁用” 将被过滤

这里是一个样品:

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 --