Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何进行这种查询?_Sql - Fatal编程技术网

Sql 如何进行这种查询?

Sql 如何进行这种查询?,sql,Sql,用户可以有暂停。我想选择一个用户和他的暂停,但我只希望暂停在暂停.suspended\u date>现在()的位置。我想返回用户不管 听起来像是左连接,但是: SELECT * FROM users LEFT JOIN suspensions ON suspensions.user_id=users.id WHERE suspensions.suspended_date > now() 如果他们真的有停职,这会很好,但如果他们没有停职,就会造成麻烦,因为where条款总是会失败 我如何用

用户可以有暂停。我想选择一个用户和他的暂停,但我只希望暂停在暂停.suspended\u date>现在()的位置。我想返回用户不管

听起来像是左连接,但是:

SELECT *
FROM users
LEFT JOIN suspensions ON suspensions.user_id=users.id
WHERE suspensions.suspended_date > now()
如果他们真的有停职,这会很好,但如果他们没有停职,就会造成麻烦,因为where条款总是会失败

我如何用一个查询来写这个

SELECT *
FROM users
LEFT JOIN suspensions ON suspensions.user_id=users.id
WHERE suspensions.suspended_date > now() or suspensions.suspended_date is null

这样就可以了。

您可以尝试将筛选器从WHERE移到JOIN语句

SELECT *
FROM   users 
       LEFT JOIN suspensions 
       ON suspensions.user_id=users.id AND suspensions.suspended_date > now()
试试这个:

SELECT *
FROM users
LEFT JOIN suspensions ON suspensions.user_id=users.id
WHERE suspensions.suspended_date > now() or suspensions.user is null 

这不起作用,因为缺少的挂起不是“null”。它只是不存在。当左连接不匹配时,null将显示在表中与join子句不匹配的列中。嗯……它不在Postgres中。你在哪个数据库工作?很有趣。你在Postgres中试过我的问题吗?我查阅了文档,我的语法看起来也可以在那里使用。它在tSQL和MySQL中工作(我记得)。是的,我在postgres中尝试过,复制并粘贴了它。我没有得到结果。我的意思是,一个左连接当然会用空值填充不存在的右表,但它看起来不会将不匹配的右行视为空值,直到查询完成。WHERE过滤最终结果集,丢弃没有暂停的行。通过将where条件移动到联接中,可以允许左联接按预期工作。