我正在处理与PHP page
相关联的Oracle
。我遇到了这个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>'
。
'and'
所以我的两个问题是。
在上述查询中使用AND vs WHERE时,有人可以解释一下这个区别吗?
提前致谢!
答案 0 :(得分: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联接,否则将详细信息保留为空。
在第二个中,你从A获取,然后在有匹配的id时加入B,否则将详细信息保留为null,然后只保留A中的行,其中有一个B匹配的logId - 在过程中消除A中的行,并事实上将其转换为内部联接。
答案 1 :(得分:2)
如果您只希望两个表中包含值的结果,您真正想要的是内部联接。一旦你有了这个,那么过滤结果并不重要。
答案 2 :(得分:2)
现在,当我以tableB中没有条目的用户身份登录时,我仍然在此查询运行时获取记录。
只需更改查询即可使用inner join
,如下所示:
select tableA.id, tableA.name, tableB.details
from tableA
inner join tableB ...
以下是来自Oracle的left join
的定义:
LEFT JOIN(也称为LEFT OUTER JOIN)关键字返回左表(table_name1)中的所有行,即使右表(table_name2)中没有匹配项也是如此。
而inner join
的定义是:
当两个表中至少有一个匹配时,INNER JOIN关键字返回行。