SELECT a.QTY FROM A LEFT JOIN B WHERE A.BRAN 或 B.BRAN 的区别?

heavyrain1234 2011-05-10 04:36:51
SELECT a.QTY FROM A LEFT JOIN B WHERE A.BRAN 或 B.BRAN 的区别?

方法一:SELECT a.QTY FROM A
LEFT JOIN B
WHERE A.BRAN LIKE '3' 返回7599行,

方法二:
SELECT a.QTY FROM A
LEFT JOIN B
WHERE B.BRAN LIKE '3' 返回8689行

我的理解:方法一应该返回行数多一些吧?方法二应该返回少一些吧,
因为方法一是直接从FROM A 来取数据的,
而方法二是LEFT JOIN B 貌似条件更苛求些。

实际结果不然。
...全文
73 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
heavyrain1234 2011-06-10
  • 打赏
  • 举报
回复
其他问题,解决了。
heavyrain1234 2011-05-10
  • 打赏
  • 举报
回复
我记录行数是 A>B,A约85万,B 1.4万;

不同方法间,A和B连接条件都是一样的,

我认可2楼的结果,

但是实际结果和2楼相反,怪事。


304的的哥 2011-05-10
  • 打赏
  • 举报
回复

--方法一:
SELECT a.QTY
FROM A LEFT JOIN B
--这里应该还有一个连接条件
WHERE A.BRAN LIKE '3'--这写法等于a.bran='3'
返回7599行,

方法二:
SELECT a.QTY
FROM A LEFT JOIN B
--这里应该还有一个连接条件
WHERE B.BRAN LIKE '3'--这写法等于b.bran='3'
--返回8689行
--
--两个方法都是左连接,即以A表为基准
--若是匹配的话:like '%3%'
--方法一
-- 以a表为准,查询a表中bran字段含有字符'3'的记录,
-- 并返回记录
--方法二
-- 还是以a表为基准,但是这次需要检查b表中bran字段
-- 是否含有字符'3',若含有且满足左连接的条件,
-- 就返回记录
--
--返回记录的行数是不确定的,这还得参照你当前的数据库表里面的数据
--不同的过滤条件,返回的结果可能相同,可能不同
tangren 2011-05-10
  • 打赏
  • 举报
回复
SQL> col name for a10
SQL> select * from t1;

NAME
----------
ab1
ab2
ab3
ab4
ab5

已选择5行。

SQL> select * from t2;

NAME
----------
ab1
ab4
ab5

已选择3行。

SQL> SELECT *
2 FROM t1
3 LEFT JOIN t2
4 ON (t1.name = t2.name)
5 WHERE t1.name LIKE '%ab%';

NAME NAME
---------- ----------
ab1 ab1
ab4 ab4
ab5 ab5
ab3
ab2

已选择5行。

SQL> SELECT *
2 FROM t1
3 LEFT JOIN t2
4 ON (t1.name = t2.name)
5 WHERE t2.name LIKE '%ab%';

NAME NAME
---------- ----------
ab1 ab1
ab4 ab4
ab5 ab5

已选择3行。

SQL>
Rotel-刘志东 2011-05-10
  • 打赏
  • 举报
回复
方法二返回的结果多些是正确的。
方法一先连接表B,然后再再筛选掉A表中A.BRAN的模糊'3'结果筛选掉。
方法一先连接表B,然后再再筛选掉B表中B.BRAN的模糊'3'结果筛选掉。
如果A表中的数据量大于B表中的,那么一定是B表中返回的数据量大一些了。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧