Mysql 列上没有相等运算符的sql自联接

Mysql 列上没有相等运算符的sql自联接,mysql,join,self-join,Mysql,Join,Self Join,发布问题和有效的SQL解决方案。我的困惑是,当我过去进行自联接时,列中总是有一些相等的值(相等运算符)要联接,但在下面的示例中,似乎自联接可以在不使用相等运算符的情况下工作?在下面的示例中,使用减号运算符和,没有相等的运算符指定用于联接的列 想知道是否没有相等运算符,在我的示例中,底层的自连接是如何工作的 问题 select W1.Id from Weather W1, Weather W2 where TO_DAYS(W1.Date)-TO_DAYS(W2.Date) = 1 and W1.T

发布问题和有效的SQL解决方案。我的困惑是,当我过去进行自联接时,列中总是有一些相等的值(相等运算符)要联接,但在下面的示例中,似乎自联接可以在不使用相等运算符的情况下工作?在下面的示例中,使用减号运算符和
,没有相等的运算符指定用于联接的列

想知道是否没有相等运算符,在我的示例中,底层的自连接是如何工作的

问题

select W1.Id
from Weather W1, Weather W2
where TO_DAYS(W1.Date)-TO_DAYS(W2.Date) = 1 and W1.Temperature > W2.Temperature
给定一个天气表,编写一个SQL查询以查找所有日期的ID,这些ID的温度都高于以前(昨天)的日期

例如,返回上述天气表的以下ID:

+----+
| Id |
+----+
|  2 |
|  4 |
+----+
SQL解决方案

select W1.Id
from Weather W1, Weather W2
where TO_DAYS(W1.Date)-TO_DAYS(W2.Date) = 1 and W1.Temperature > W2.Temperature
这就是所谓的“隐式连接”——我建议您阅读SQL
join
,例如在

简而言之:数据库在不需要显式指定的情况下查找合适的联接列。

这称为“隐式联接”-我建议您阅读SQL
JOIN
,例如在


简而言之:数据库查找合适的联接列,而无需您显式指定它们。

使用
ANSI
联接编写联接,因为它们是SQL的标准部分:

select W1.Id
from Weather W1
        inner join
     Weather W2
        on TO_DAYS(W1.Date)-TO_DAYS(W2.Date) = 1 and
           W1.Temperature > W2.Temperature
(应产生相同的结果集)

连接只是匹配两组行的过程-连接的“左侧”有一个行源,而“右侧”有一个行源。在一般情况下,这些行源是表,但联接也可以将以前任何联接的结果作为行源联接

理论上,在连接中,结果将是笛卡尔积——左侧的每一行都将与右侧的每一行匹配。如果这是您想要的,您可以用
交叉连接
来表示

但是,通常我们希望将联接的结果限制为小于行的笛卡尔乘积。我们通过在
子句上写一个
(或者在示例中的
WHERE
子句中使用老式的逗号连接)来表达这些限制

最常见的联接类型是等分联接,在等分联接中,对每一侧的一列或多列进行相等性比较。但这绝不是必须的。它可以是任何有意义的谓词。例如,我半定期使用的一种连接形式称为“三角形连接”(绝非标准术语),其中每一行都与后面的每一行匹配:

SELECT
    *
FROM
    Table t1
        left join
    Table t2
        on
           t1.ID < t2.ID
选择
*
从…起
表t1
左连接
表t2
在…上
t1.ID

那很好。
中ID最低的行
将与表中的每一行匹配。具有最高
ID
值的行将不会与任何其他行匹配。

使用
ANSI
联接写入,因为它们是SQL的标准部分:

select W1.Id
from Weather W1
        inner join
     Weather W2
        on TO_DAYS(W1.Date)-TO_DAYS(W2.Date) = 1 and
           W1.Temperature > W2.Temperature
(应产生相同的结果集)

连接只是匹配两组行的过程-连接的“左侧”有一个行源,而“右侧”有一个行源。在一般情况下,这些行源是表,但联接也可以将以前任何联接的结果作为行源联接

理论上,在连接中,结果将是笛卡尔积——左侧的每一行都将与右侧的每一行匹配。如果这是您想要的,您可以用
交叉连接
来表示

但是,通常我们希望将联接的结果限制为小于行的笛卡尔乘积。我们通过在
子句上写一个
(或者在示例中的
WHERE
子句中使用老式的逗号连接)来表达这些限制

最常见的联接类型是等分联接,在等分联接中,对每一侧的一列或多列进行相等性比较。但这绝不是必须的。它可以是任何有意义的谓词。例如,我半定期使用的一种连接形式称为“三角形连接”(绝非标准术语),其中每一行都与后面的每一行匹配:

SELECT
    *
FROM
    Table t1
        left join
    Table t2
        on
           t1.ID < t2.ID
选择
*
从…起
表t1
左连接
表t2
在…上
t1.ID

那很好。
中ID最低的行
将与表中的每一行匹配。具有最高
ID
值的行将不会与任何其他行匹配。

这是用于哪个RDBMS的?无论您使用的是MySQL、PostgreSQL、Oracle、SQL Server还是IBM DB2,甚至是其他什么,这通常都会产生影响。请在您的问题中添加相关标签@marc_s,它是为MySQL 5.x设计的。这是为哪个RDBMS设计的?无论您使用的是MySQL、PostgreSQL、Oracle、SQL Server还是IBM DB2,甚至是其他什么,这通常都会产生影响。请在您的问题中添加相关标签@marc_s,这是MySQL 5.x版的。感谢您的伟大回答,不信者Damien_,投票支持并标记为答案感谢您的伟大回答,不信者Damien_,投票支持并标记为答案