SQL:内部 JOIN 语句没有给出正确的记录 [关闭]

Posted

技术标签:

【中文标题】SQL:内部 JOIN 语句没有给出正确的记录 [关闭]【英文标题】:SQL: Inner JOIN statement doesn't give the right records [closed] 【发布时间】:2022-01-03 13:23:33 【问题描述】:

使用下面的 SQL,我正在尝试从右表“order_flags”中记录所有匹配的行。

 SELECT id, 
        po_number, 
        alert 
 FROM orders 
 INNER JOIN order_flags on order_flags.order_fk 
 WHERE order_flags.alert = " date("Y-m-d") . "
 AND order_flags.order_fk = orders.id 
 AND orders.flag_overdue_po='1';

表格如下。第一个是orders 表,第二个是order_flags 表。

【问题讨论】:

连接的on 子句应该包含某种比较,例如on users.department_id = departments.id 或类似的。你的只包含一个片面的表达式,所以它可能总是评估为真。修改您对 JOIN 的理解并查看一些示例。 " date("Y-m-d") . " - 我什至猜不出这是什么意思 - 也许 `order_flags.order_fk = orders.id` 应该是加入条件? @P.Salmon 是真的。将一些 php 放入字符串中可能是一次拙劣的尝试。我刚刚删除了 PHP 标记,虽然现在您已经指出了这一点,但可能是有原因的。他们没有理由不能只使用 SQL 生成日期。 SELECT id, po_number, alert FROM orders INNER JOIN order_flags on order_flags.order_fk = orders.id WHERE order_flags.alert = 'your date' AND orders.flag_overdue_po='1'; 【参考方案1】:

没有进一步调查,但您的 ON 语句只包含一个值。它需要两个表的两个匹配列,例如

ON table1.column_id = table2.column_id

【讨论】:

一般来说不正确。 ON clause 表达式必须返回可以被视为布尔值的标量值,而不是更多。没有其他限制。【参考方案2】:

如果不确定相关记录一定存在于order_flags中,请使用左连接。sql可能

SELECT id, 
        po_number, 
        alert 
 FROM orders 
 LEFT JOIN order_flags on order_flags.order_fk = orders.id
 WHERE order_flags.alert = " date("Y-m-d") . "
 AND orders.flag_overdue_po='1';

【讨论】:

以上是关于SQL:内部 JOIN 语句没有给出正确的记录 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中LEFT JOIN和RIGHT JOIN 以及INNER JOIN的区别

关于SQL数据库中cross join 和inner join用法上的区别?

sql join 的语句怎么写?

sql语句中join、left join 、right join有啥区别?

sql中union 和 union all的区别

sql语句中JOIN ON 的使用