正确的sql解决方案?

正确的sql解决方案?,sql,sql-server,sql-server-2008,join,Sql,Sql Server,Sql Server 2008,Join,我有一个下面的问题,关于下面哪一个sql适合这类问题 问题1: 我有两张桌子:表一和表二。表1有100万条记录,包含变量ID和年龄。年龄是最接近10岁(例如10、20、30、40…)的带扣变量。表2包含100条记录,并包含变量ID和薪水。ID在每个数据集中都是唯一的。下面是一位分析师编写的SQL查询。这有什么用?结果表有多少行 SELECT a.ID,a.AGE,b.SALARY FROM TABLE1 a LEFT JOIN TABLE2 b ON a.ID=b.ID WHERE b.SA

我有一个下面的问题,关于下面哪一个sql适合这类问题

问题1:


我有两张桌子:表一和表二。表1有100万条记录,包含变量ID和年龄。年龄是最接近10岁(例如10、20、30、40…)的带扣变量。表2包含100条记录,并包含变量ID和薪水。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上进行匹配的两个表的所有匹配记录,并且还将保留表1中的所有记录。然后,它在这个左联接表上放置一个过滤器,只选择那个些个人工资超过50000的记录

就记录数量而言,当左连接完成时,它最初会有1毫米的记录。但在过滤之后,根据实际工资超过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:我想生成一个数据集,该数据集包含表1中的所有记录,但只连接到工资高于50000的表2。您将如何“修复”该查询

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记录


这两种理解都正确吗?

这些听起来像是家庭作业问题,但你似乎已经做出了很好的尝试来回答它们

第一个查询返回0到100行。为什么?简单。
WHERE
子句将
左连接
转换为
内部连接
。在不匹配的行中,
b.SALARY
NULL
,并且不满足
WHERE
条件。你对第一个问题的回答不完整

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


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

第一个问题的答案应该在50到100条记录之间。 我的推理是,当我们进行左连接时,记录的数量会减少到100条。 在100条记录中,我们知道100k是中位数——这意味着至少有50条记录的工资高于50000。
当50k是平均值时,这意味着也有低于50k的记录,这需要加以考虑

“结果表有多少行?”-->执行它并查看。若要仅与B表中薪资高于50K的行进行联接,请将该部分联接条件设置为:
ON a.ID=B.ID且B.Salary>50000
。生成1000000行似乎毫无意义……如果将其设置为正确联接,则只会给出薪资高于50000的记录数。注意:由于可能没有,请暂时删除此参数(即删除“WHERE b.SALARY>50000”)以确认任何行是否连接,如果b表中的所有行在a表中都有相应的id,则将得到100行…是。它更优化,使其成为和。三年后我开始使用sql,现在有点生疏了,没有意识到我可以使用and。顺便说一句,一个好的优化器会发现查询#1返回空值,无论如何都会被过滤,并在优化之前将连接重写为内部连接。你是说第一个查询返回的值在0-1MM之间?。你提到了0-100。问你是不是指0-1MM。是的,我们也可以使用和。我没意识到。@user。不,我想我很清楚。在0到100之间。第二个表有100个与另一个表中的唯一ID匹配的唯一ID。
WHERE
子句将联接操作转换为内部联接。最多只能返回100行。是。你是对的。在哪里可以做内部和内部上限将是100