-1

对于我的新项目,我决定在导入之前优化我在旧项目中使用的各种低效 SQL 查询。在我认为似乎很简单的问题上几个小时后,我不知所措。我有两个持有用户 ID 的不同表

table r     table s
+-----+     +-----+
| user|     | user|
+-----+     +-----+
|  2  |     |  1  |
|  3  |     |  4  |
|  4  |     +-----+
+-----+

我现在想要的是比较两个表并在结果表的另一列中设置一个真或假标志,这向我显示表 s 在表 r 中的值。所以我想要的只是将割集设置为真。结果表应如下所示

     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   |
+-----+-------+

所以每个用户的最后一行似乎是我想要的结果,但问题是假表与标志结合在一起,每个用户都有两个标志。我不明白出了什么问题,如果有人能解释一下 SQL 服务器如何理解我的查询以及我必须改变什么以获得正确的结果,我将不胜感激

4

2 回答 2

1

您没有连接条件,因此您的查询只是在两个表之间创建一个笛卡尔积。然后,它会根据用户是否匹配特定配对来报告真假。如果您将其包含s.user在您的 SELECT 子句中,您会看到这一点。

要做你想做的事,你应该使用外连接。

SELECT s.user, r.user IS NOT NULL AS flag
FROM s
LEFT JOIN r
ON r.user = s.user
于 2013-08-29T23:46:59.360 回答
0

尝试:

SELECT r.user FROM r,s flag WHERE r.user = s.user
于 2013-08-29T23:54:58.077 回答