关于以下哪个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,那么它最终将没有记录。
另外我相信如果我像下面那样做一个工资,它应该给出一个错误,因为表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中的所有记录,但只加入TABLE2,工资大于50000.如何“修复”查询?
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
这将是def。在第一次过滤时给出至少1MM的记录,然后给出连接。
对两者都有正确的理解吗?
答案 0 :(得分:1)
这听起来像是家庭作业问题,但你似乎已经很好地回答了这些问题。
第一个查询返回0到100行。为什么?简单。 WHERE
子句将LEFT JOIN
变为INNER JOIN
。在不匹配的行中,b.SALARY
为NULL
且未通过WHERE
条件。你对第一个问题的答案是不完整的。
第二个问题的最简单答案是将条件从WHERE
子句移到ON
子句。您的答案也是正确的,但可能会使优化程序混淆并产生一个不太理想的查询计划(尽管不在SQL Server中)。实际上,当我第一次学习LEFT JOIN
时,在习惯ON
子句中的附加条件之前,我使用子查询来实现此目的。
你对第二个问题的回答是可以接受的,但可能不是你想要的答案。
答案 1 :(得分:0)
第一个问题的答案应该在50到100条记录之间。 我的推理-当我们进行左联接时,记录数下降到100。 在100条记录中,我们知道100k是中位数-这意味着至少有50条记录在薪水50000以上。 当“ 50k”是“均值”时,这意味着也有低于50k的记录,需要将其考虑在内。