正确的sql解决方案?
我有一个下面的问题,关于下面哪一个sql适合这类问题 问题1:正确的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
我有两张桌子:表一和表二。表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