2013-05-06 62 views
2

我正在研究与Oracle连接的PHP page。我遇到了这个SQL,我不确定它在做什么,所以我想我会问这里。有问题的SQL是这样的:SQL中AND与WHERE子句的用法

select tableA.id, tableA.name, tableB.details 
from tableA 
left join tableB on 
tableB.id = tableA.id 
and 
tableB.logId = '<logged_in_user>' 

现在,当我登录为谁没有TableB中条目的用户,我仍然得到记录时,该查询运行。我的假设是,而不是'and'该条款应该是'where'

left join tableB on 
    tableB.id = tableA.id 
    where 
    tableB.logId = '<logged_in_user>' 

所以我的两个问题是。

  1. 我说错了吗?
  2. 如果是这样,那么为什么查询返回结果?子句检查是什么'and'

有人可以解释在上述查询中使用AND vs WHERE时的区别吗?

在此先感谢!

+0

既然你没有告诉我们tableA和tableB是什么,或者你想从这个查询中看到什么样的行为,我们不能告诉你这个查询应该是什么。我们所能做的就是指出“left join tableB on ... where tableB.logId = ...'将永远是错误的。 – 2013-05-06 14:22:16

回答

7

对吗?

号这个查询:

select tableA.id, tableA.name, tableB.details 
from tableA 
left join tableB 
on tableB.id = tableA.id 
and tableB.logId = '<logged_in_user>' 

是非常不同:

select tableA.id, tableA.name, tableB.details 
from tableA 
left join tableB 
on tableB.id = tableA.id 
where tableB.logId = '<logged_in_user>' 

这是用于连接标准。

在第一种情况下,您从A取得数据,然后在存在匹配的ID logId时加入B,否则请留下详细信息null。

在第二个,你从A点拿,那么结果与B连接时,有一个匹配的ID,否则留下详细空,然后你从A那里的,有一个LOGID一个B匹配只保留行 - 消除在这个过程中来自A的行,事实上将它变成一个内部连接。

+0

+1,因为这是一种替代方案,但是它不是利用“INNER JOIN”以更清洁的方式解决问题吗? – 2013-05-06 14:18:16

+0

是的,我偶然编辑了我的最后一段来添加这个评论。 :) – 2013-05-06 14:18:52

+0

非常感谢!这解释了很多..我仍然困惑的唯一一件事是:在第一个,因为logId不会找到匹配的登录用户,它应该不给任何结果?因为条件'和tableB.logId ='''不会有结果? – 2013-05-06 14:19:44

2

如果您只想要两个表格中的值,那么您真正需要的是内部连接。一旦你有了这些,过滤结果的位置并不重要。

2

现在,当我以tableB中没有条目的用户身份登录时,在查询运行时,我仍然收到记录。

只需更改查询使用一个inner join这样的:

select tableA.id, tableA.name, tableB.details 
from tableA 
inner join tableB ... 

这里是left join从Oracle定义:

的LEFT JOIN(也称为LEFT OUTER JOIN)关键字返回左表(table_name1)中的所有行,即使右表(table_name2)中没有匹配项也是如此。

inner join的定义是:

的INNER JOIN关键字返回行当存在两个表中的至少一个匹配。

+0

谢谢!我意识到,内部连接是去这里的方式...我只是仍然试图围绕我的头为什么AND子句给了我结果 - 我想我将不得不阅读更多关于连接.. – 2013-05-06 14:21:26

+0

@open_sourse,因为你需要利用'IS NOT NULL'来处理NULL值,所以你必须添加到WHERE子句中。 – 2013-05-06 14:22:09

+0

感谢您的帮助! – 2013-05-06 14:28:20