3

我正在研究PHP pageOracle. 我遇到了这个 SQL,我不确定它是否在做应该做的事情,所以我想我会在这里问。有问题的 SQL 是这样的:

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 与 WHERE 时的区别吗?

提前致谢!

4

3 回答 3

9

我对吗?

不,这个查询:

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 获取,然后在有匹配的 idlogId 时加入 B,否则将 details 保留为 null。

在第二个中,您从 A 获取,然后在有匹配的 id 时与 B 连接,否则将 details 保留为空,然后您只保留来自 A 的行,其中存在具有 logId 的 B 匹配- 在此过程中消除来自 A 的行, 并且事实上将它变成了一个内部连接。

于 2013-05-06T14:16:29.357 回答
2

如果您只想要两个表中都有值的结果,那么您真正想要的是内部联接。一旦你有了它,你在哪里过滤结果并不重要。

于 2013-05-06T14:15:20.037 回答
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) 中没有匹配项。

而 the 的定义inner join是:

当两个表中至少有一个匹配项时,INNER JOIN 关键字返回行。

于 2013-05-06T14:15:30.317 回答