正确的sql解决方案?

时间:2015-06-05 21:53:31

标签: sql sql-server sql-server-2008 join

关于以下哪个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的记录,然后给出连接。

对两者都有正确的理解吗?

2 个答案:

答案 0 :(得分:1)

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

第一个查询返回0到100行。为什么?简单。 WHERE子句将LEFT JOIN变为INNER JOIN。在不匹配的行中,b.SALARYNULL且未通过WHERE条件。你对第一个问题的答案是不完整的。

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

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

答案 1 :(得分:0)

第一个问题的答案应该在50到100条记录之间。 我的推理-当我们进行左联接时,记录数下降到100。 在100条记录中,我们知道100k是中位数-这意味着至少有50条记录在薪水50000以上。 当“ 50k”是“均值”时,这意味着也有低于50k的记录,需要将其考虑在内。