当from子句中包含两个表时,为什么sql语句返回重复的行?

当from子句中包含两个表时,为什么sql语句返回重复的行?,sql,sql-server,Sql,Sql Server,嗨,我周一有一个考试,我需要一些帮助来理解这个sql语句 select emp.emp_pin as 'emp_pin', emp.emp_salary as 'emp_salary' from Employer emp, Employer emp2 where emp.emp_salary = 12000 为什么查询返回x行次数(其中x表示表中的行数)?当我从条款中删除雇主emp2时,它可以正常工作 例如:如果表中有这些数据: emp_pin|emp_salary 1 |12000

嗨,我周一有一个考试,我需要一些帮助来理解这个sql语句

select emp.emp_pin as 'emp_pin', emp.emp_salary as 'emp_salary'
from Employer emp, Employer emp2
where emp.emp_salary = 12000
为什么查询返回x行次数(其中x表示表中的行数)?当我从条款中删除雇主emp2时,它可以正常工作

例如:如果表中有这些数据:

emp_pin|emp_salary
1      |12000
2      |12000
3      |12000
查询将返回:

    emp_pin|emp_salary
    1      |12000
    1      |12000
    1      |12000
    2      |12000
    2      |12000
    2      |12000
    3      |12000
    3      |12000
    3      |12000

你得到了一个叉积。表中有三行,但实际上并没有连接这两个表

select emp.emp_pin as 'emp_pin', emp.emp_salary as 'emp_salary'
from Employer emp, Employer emp2
where emp.emp_salary = 12000

AND emp.EMP_PIN = emp2.EMP_PIN
通过在中添加相同的表,可以将每个表中的行相乘,从而将一个表中的每一行连接到另一个表中的每一行。因此,每个结果集返回3行,9行。添加join语句将减少返回的行数

使用
JOIN
语法编写查询的另一种方法

select emp.emp_pin as 'emp_pin', emp.emp_salary as 'emp_salary'
from Employer emp JOIN Employer emp2
ON emp.EMP_PIN = emp2.EMP_PIN
where emp.emp_salary = 12000

正如注释已经说明的那样,使用笛卡尔乘积可以得到重复的行。使用联接所需的查询如下:

select emp.emp_pin as 'emp_pin', emp.emp_salary as 'emp_salary'
from Employer emp join Employer emp2 on emp.emp_pin=emp2.emp_pin
where emp.emp_salary = 12000;

因为您正在进行交叉联接,这是笛卡尔乘积的另一个名称。学习SQL时,只需遵循一条简单的规则:在
from
子句中不要使用逗号。始终使用显式的
join
语法。或者指定您希望它与emp2的列区别开来,您就会明白:选择emp.emp_pin作为'emp_pin',emp.emp_salary作为'emp_salary',emp2.emp_pin作为'emp2_pin',emp2.emp_salary作为'emp2_salary'@Br0therzS0ul-否,DISTINCT在这里不是一个好选项:使用它将隐藏查询中的问题(这将在以后影响到您),并且可能会比使用正确的联接解决方案给数据库服务器带来更多的工作(尤其是在表增长的情况下)。我的问题被否决的原因是什么?我想要一些反馈!