【发布时间】:2015-06-05 21:53:31
【问题描述】:
关于以下哪个 sql 适合问题类型,我有以下问题。
问题 1:
我有两个表:TABLE1 和 TABLE2。 TABLE1 有 100 万条记录并包含变量 ID 和 AGE。 AGE 是最近 10 年的分桶变量(例如 10、20、30、40 ……)。 TABLE2 包含 100 条记录并具有变量 ID 和 SALARY。 ID 在每个数据集中都是唯一的。下面是分析师编写的 SQL 查询。这是做什么的?结果表有多少行?
SELECT a.ID,a.AGE,b.SALARY
FROM TABLE1 a LEFT JOIN TABLE2 b ON a.ID=b.ID
WHERE b.SALARY>50000
我的第一个答案:
此查询将首先创建两个表的左连接。表 1 和表 2。这意味着它将保留在 Id 上完成匹配的两个表的所有匹配记录。它还将保留 table1 中的所有记录。然后对这个左连接表进行过滤,只选择个人工资超过 50000 的那些记录。
就没有。记录,当左连接完成时,它最初将有 1MM 记录。但是在过滤器之后,根据实际有多少记录的薪水超过 50000,它也可能有零记录。如果没有记录或 Id 的薪水超过 50000,那么它最终将有零记录。
另外我相信,如果我像下面那样做 a.salary,它应该会给出一个错误,因为表 1 中不存在工资变量。
SELECT a.ID,a.AGE,b.SALARY
FROM TABLE1 a LEFT JOIN TABLE2 b ON a.ID=b.ID
WHERE a.SALARY>50000
问题 2:我想生成一个数据集,其中包含 TABLE1 中的所有记录,但只连接到工资大于 50000 的 TABLE2。您将如何“修复”查询?
My answer: It should be below:
SELECT a.ID,a.AGE,b.SALARY
FROM TABLE1 a LEFT JOIN
(select Id, Salary from TABLE2 where salary >50000) as b
ON a.ID=b.ID
这将定义。在第一次过滤然后给出连接时给出至少 1MM 记录。
这对双方的理解是否正确?
【问题讨论】:
-
"结果表有多少行?" --> 执行一下看看。要仅连接 B 表中薪水高于 50K 的行,请将其作为连接条件的一部分:
ON a.ID = b.ID AND b.Salary > 50000。 -
生成 1,000,000 行似乎毫无意义……如果您将其设为 RIGHT JOIN,它只会给出薪水大于 50,000 的记录数。注意:因为可能没有,所以暂时取出这个参数(即删除“WHERE b.SALARY>50000”)以确认任何行加入,如果b表中的所有行在a中都有对应的id表然后你会得到 100 行...
-
是的。它更优化以使其成为和。三年后我正在使用 sql,现在有点生疏了,没有意识到我可以使用 AND。
-
顺便说一句,一个体面的优化器会识别出查询 #1 返回的 NULL 无论如何都会被过滤,并在优化之前将连接重写为内部连接。
标签: sql sql-server sql-server-2008 join