mariadb 混淆SQL查询、虚拟表和自联接

efzxgjgh  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(117)

我正在学习SQL,我正在使用虚拟表和自连接,表(名称:我正在做的是在图像中。

这个查询的目的是找到配额比他们的经理高的员工,但是对于这个查询,我很难理解为什么

SELECT EMPL.NAME, EMPL.`QUOTA`, MNG.`QUOTA`
FROM `SALESREPS` EMPL, `SALESREPS` MNG
WHERE MNG.`EMPL_NUM` = EMPL.`MANAGER`
AND EMPL.`QUOTA` > MNG.`QUOTA`;

输出为:

+-------------+-----------+-----------+
| NAME        | QUOTA     | QUOTA     |
+-------------+-----------+-----------+
| Mary Jones  | 300000.00 | 275000.00 |
| Larry Fitch | 350000.00 | 275000.00 |
| Bill Adams  | 350000.00 | 200000.00 |
| Dan Roberts | 300000.00 | 200000.00 |
| Paul Cruz   | 275000.00 | 200000.00 |
+-------------+-----------+-----------+

这是正确的,这就是我想要的。但是如果我将WHERE子句改为

SELECT EMPL.NAME, EMPL.`QUOTA`, MNG.`QUOTA`
FROM `SALESREPS` MNG, `SALESREPS` EMPL
WHERE MNG.`MANAGER` = EMPL.`EMPL_NUM`
AND EMPL.`QUOTA` > MNG.`QUOTA`;

输出为:

+-------------+-----------+-----------+
| NAME        | QUOTA     | QUOTA     |
+-------------+-----------+-----------+
| Sam Clarck  | 275000.00 | 200000.00 |
| Larry Fitch | 350000.00 | 300000.00 |
+-------------+-----------+-----------+

这是不正确的。我不明白为什么会这样。我只是交换我在每个虚拟表(EMPL和MNG)中引用的列。我从

WHERE MNG.EMPL_NUM = EMPL.MANAGER

WHERE MNG.MANAGER = EMPL.EMPL_NUM

但是等式应该会产生相同的结果,然而,它并不是这样发生的。也许原因很明显,我累了或分心,我看不到它。这个问题并不迫切需要解决,但不知道为什么会发生这种情况是困扰我。

avkwfej4

avkwfej41#

假设两个例子都包含相同的 predicate 表达式:

EMPL.`QUOTA` > MNG.`QUOTA`

这是:

WHERE MNG.EMPL_NUM = EMPL.MANAGER
WHERE MNG.MANAGER = EMPL.EMPL_NUM

因为它颠倒了角色,相对于哪一个,现在必须大于另一个。
在我这里,NEVER使用以下语法组合合并表:

FROM `SALESREPS` EMPL, `SALESREPS` MNG

自30多年前ANSI-92标准发布以来,这已经过时了。如果你是从这样教它的材料中学习,* 你应该抛弃那些材料 *。它不会把你引向好的方向。
查询的
正确**写法是这样的:

SELECT EMPL.NAME, EMPL.`QUOTA`, MNG.`QUOTA`
FROM `SALESREPS` EMPL
INNER JOIN `SALESREPS` MNG ON MNG.`EMPL_NUM` = EMPL.`MANAGER`
WHERE EMPL.`QUOTA` > MNG.`QUOTA`;
wqnecbli

wqnecbli2#

基本上,这是非常简单的,如果你真的把这一个表作为两个表在你的脑海中。
这是你的第一个变体,哪一个是非常好的和合乎逻辑的。你从雇员开始,加入经理,检查配额中的差异,并为雇员的结果名称和两个表中的引用设置非常清晰的列。Your first variant
但是,你的第二个变体真的很混乱,因为你从一个错误的表开始,从经理开始,并输入来自员工的结果数据:Your second variant
因此,在第二种情况下,SQL Server的任务听起来像:请告诉我那些员工,谁是经理的经理(因为您通过经理的代码将表EMP链接到表MNG,所以您希望看到,谁是表中每个经理的经理),并仅显示那些结果,其中经理的配额经理大于经理本身。
所以,如果你想清楚自己,只要从逻辑点开始SQL。想想,哪些表应该在左边,以及你应该如何一步一步地将所有其他表连接到第一个表。请使用join来加入=)

相关问题