下面的联接是我认为的theta联接,即非等联接。我说的对吗?对等联接适用于匹配项,非等联接适用于不匹配项。那么以下非等额联接如何工作?
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMPTBL E, SALGRADE S
WHERE E.SAL
BETWEEN S.LOSAL AND S.HISAL;
答案 0 :(得分:1)
避免逗号分隔的连接使用现代显式连接
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMPTBL E join SALGRADE S
on E.SAL>=S.LOSAL and E.SAL<=S.HISAL
答案 1 :(得分:1)
以逗号分隔的联接已成为历史(根据1992年的SQL标准,它们已变得多余),因此不再使用。如果这些表不相关,我们将用逗号CROSS JOIN
替换逗号以使意图清楚,即
SELECT e.ename, e.sal, s.grade
FROM emptbl e, salgrade s
是
SELECT e.ename, e.sal, s.grade
FROM emptbl e
CROSS JOIN salgrade s
但是,在您的情况下,您有加入条件。
SELECT e.ename, e.sal, s.grade
FROM emptbl e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
是
SELECT e.ename, e.sal, s.grade
FROM emptbl e
INNER JOIN salgrade s OB e.sal BETWEEN s.losal AND s.hisal;
此联接的作用是:将每个emptbl
记录与所有salgrade
薪水在salgrade
范围内的e.sal BETWEEN s.losal AND s.hisal
记录合并。据说这只是一行,因为薪水等级可能不会重叠。
e.sal <= s.losal AND e.sal >= s.hisal
也可以写为
=
清空
ename | sal ------+----- John | 1000 Jane | 1500
盐分
grade | losal | hisal ------+-------+------ low | 0 | 800 med | 801 | 1200 high | 1201 | 2000
结果
ename | sal | grade ------+------+------ John | 1000 | med <-- because 1000 BETWEEN 801 AND 1200 Jane | 1500 | high <-- because 1500 BETWEEN 1201 AND 2000
顺便说一句,非等额联接的功能与等额联接的功能相同,因此不必了解此词汇表。唯一的区别是,等式联接在<=
上联接,非等联接在其他比较中联接,例如self.initial_data
。