为什么这个 RIGHT 加入 returns 其他未决状态的发票?
Why this RIGHT join returns invoices with state other then pending?
我正在构建生成 SQL 查询的库,并发现了我不明白为什么会这样的案例。我同意,一般来说,您应该按“where”而不是“on”过滤掉,但 ON 允许过滤掉 LEFT join。尽管对于 RIGHT join,我得到的结果与请求不匹配。我想知道为什么 RIGHT join 会这样。
用户(table 姓名 _user
):
发票(table姓名_invoice
):
查询:
SELECT
_user.id AS userId,
_user.name AS userName,
_user.state AS userState,
_invoice.id AS invoiceId,
_invoice.userId AS invoiceUserId,
_invoice. `state` AS invoiceState
FROM
_user
RIGHT JOIN _invoice on _invoice.state = 'pending'
回复:
问题:
最好逐步执行此查询结果,以了解它究竟是如何发生的。
A right join
保留来自 second table 的所有行,无论 on
子句的计算结果是否为“true”、“false” ", 或 NULL
.
不过,您大概需要一个有效的 join
条件。我的猜测是您需要所有用户和任何未决发票的列表。如果是这样,正确的逻辑是:
SELECT . . .
FROM _user u LEFT JOIN
_invoice i
ON i.userid = u.id AND i.state = 'pending';
至少,这会产生一个看起来可用的结果。
我正在构建生成 SQL 查询的库,并发现了我不明白为什么会这样的案例。我同意,一般来说,您应该按“where”而不是“on”过滤掉,但 ON 允许过滤掉 LEFT join。尽管对于 RIGHT join,我得到的结果与请求不匹配。我想知道为什么 RIGHT join 会这样。
用户(table 姓名 _user
):
发票(table姓名_invoice
):
查询:
SELECT
_user.id AS userId,
_user.name AS userName,
_user.state AS userState,
_invoice.id AS invoiceId,
_invoice.userId AS invoiceUserId,
_invoice. `state` AS invoiceState
FROM
_user
RIGHT JOIN _invoice on _invoice.state = 'pending'
回复:
问题:
最好逐步执行此查询结果,以了解它究竟是如何发生的。
A right join
保留来自 second table 的所有行,无论 on
子句的计算结果是否为“true”、“false” ", 或 NULL
.
不过,您大概需要一个有效的 join
条件。我的猜测是您需要所有用户和任何未决发票的列表。如果是这样,正确的逻辑是:
SELECT . . .
FROM _user u LEFT JOIN
_invoice i
ON i.userid = u.id AND i.state = 'pending';
至少,这会产生一个看起来可用的结果。