为问题标题道歉,但不知道什么功能可以实现我的需要。
为简单起见,我有以下表格:
UserID | date | action
----------------------------
1 | 1/1/2015 |
2 | 1/1/2015 |
2 | 2/1/2015 |
2 | 3/1/2015 |
2 | 4/1/2015 | sale
3 | 2/1/2015 |
3 | 4/1/2015 |
4 | 5/1/2015 |
4 | 7/1/2015 | sale
5 | 3/1/2015 | sale
6 | 4/1/2015 |
7 | 9/1/2015 | sale
我希望能够运行一个查询,其中我将排除所有不会以任何操作结束的UserID。
因此我希望看到这个:
UserID | date | action
----------------------------
2 | 1/1/2015 |
2 | 2/1/2015 |
2 | 3/1/2015 |
2 | 4/1/2015 | sale
4 | 5/1/2015 |
4 | 7/1/2015 | sale
5 | 3/1/2015 | sale
7 | 9/1/2015 | sale
这可以在SQL中完成吗?
答案 0 :(得分:1)
假设action列中的空格为NULL,您可以这样写:
SELECT
u.UserID,
u.date,
u.action
FROM
(SELECT UserID FROM users WHERE action IS NOT NULL GROUP BY UserID) action_user
JOIN
users u ON u.UserID = action_user.UserId
如果它实际上是一个空白值,您可以将子查询action_user中的条件更新为WHERE.action!=''
如果您的数据库引擎支持EXISTS,您可以使用它来提高可读性:http://www.techonthenet.com/sql/exists.php。避免IN / NOT IN用于引用许多行的子查询,因为这通常导致执行RBAR(逐行),性能较差。 IN / NOT IN通常保留用于特定的一组值,而不是子查询。