对于我的新项目,我决定在导入之前优化我在旧项目中使用的所有低效SQL查询。几个小时之后我认为这个问题看起来很简单,我感到很茫然。我有两个不同的表持有用户ID
table r table s
+-----+ +-----+
| user| | user|
+-----+ +-----+
| 2 | | 1 |
| 3 | | 4 |
| 4 | +-----+
+-----+
我现在想要的是比较两个表并在结果表的另一列中设置true或false标志,该表显示表r中表s的值。所以我想要的只是将cut-set设置为true。结果表应如下所示
result
+-----+-------+
| user| flag |
+-----+-------+
| 1 | FALSE |
+-----+-------+
| 4 | TRUE |
+-----+-------+
因此,用户4是表r中列出的唯一用户。我已经尝试了一些带有IF子句的解决方案,但我不是SQL的专业人员,但我会尽力接近这个目标。我的想法是这个查询
SELECT
r.user,
IF(r.user = s.user, TRUE, FALSE) AS flag
FROM
r,
s
我知道它根本不正确,因为查询给了我以下6行。
result
+-----+-------+
| user| flag |
+-----+-------+
| 2 | 0 |
+-----+-------+
| 2 | 0 |
+-----+-------+
| 3 | 0 |
+-----+-------+
| 3 | 0 |
+-----+-------+
| 4 | 0 |
+-----+-------+
| 4 | 1 |
+-----+-------+
所以每个用户的最后一行似乎是我想要的结果,但问题是false表与标志组合在一起,每个用户都有两个标志。我不明白什么是错的,如果有人能解释我SQL服务器如何理解我的查询以及我需要更改以获得正确的结果,我将不胜感激
答案 0 :(得分:1)
您没有加入条件,因此您的查询只是在两个表之间创建笛卡尔积。然后根据用户是否在特定配对中匹配来报告真或假。如果在SELECT子句中包含s.user
,则会看到这一点。
要做你想做的事,你应该使用外连接。
SELECT s.user, r.user IS NOT NULL AS flag
FROM s
LEFT JOIN r
ON r.user = s.user
答案 1 :(得分:0)
尝试:
SELECT r.user FROM r,s flag WHERE r.user = s.user