【问题标题】:Right sql solution?正确的sql解决方案?
【发布时间】: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


【解决方案1】:

这些听起来像是家庭作业问题,但您似乎已经很好地尝试了回答。

第一个查询返回 0 到 100 行。为什么?简单的。 WHERE 子句将LEFT JOIN 转换为INNER JOIN。在不匹配的行中,b.SALARYNULL 并且不符合 WHERE 条件。您对第一个问题的回答不完整。

第二个问题的最简单答案是将条件从WHERE 子句移至ON 子句。您的答案也是正确的,但可能会混淆优化器并产生不太理想的查询计划(尽管在 SQL Server 中不是)。事实上,当我第一次学习LEFT JOINs 时,我使用了子查询来达到这个目的,然后才习惯了ON 子句中的附加条件。

您对第二个问题的回答是可以接受的,但可能不是您想要的答案。

【讨论】:

  • 你的意思是第一个查询返回0-1MM之间?你提到了0-100。所以问你是不是指0-1MM。是的,我们也可以使用。我没有意识到这一点。
  • @user 。 . .不,我想我很清楚。介于 0 和 100 之间。第二个表有 100 个与另一个表中的唯一 ID 匹配的唯一 ID。 WHERE 子句将连接操作转换为内部连接。最多只能返回 100 行。
  • 是的。你说的对。哪里会做内部和内部上限将是 100
【解决方案2】:

第一个问题的答案应该在 50 到 100 条记录之间。 我的推理 - 当我们进行左连接时,记录数下降到 100。 在 100 条记录中,我们知道 100k 是中位数 - 这意味着至少有 50 条记录高于 Salary 50000。 当 50k 是 Mean 时,这意味着也有低于 50k 的记录,需要考虑到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2015-04-12
    • 2018-08-30
    • 1970-01-01
    • 2015-06-17
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多