SQL查询效率(JOIN或笛卡尔积)

时间:2013-11-27 15:41:01

标签: sql performance sql-server-2008 processing-efficiency

您好我很困惑三个场景,几乎每个项目都会使用这三个场景。

我想知道哪一个会有效符合 - 更少的时间复杂性 - 效率
- 有效性

TableA(用户ID,用户名,电子邮件,电话)

TableB(用户名,TestField)

案例1

select email, TestField from TableA , TableB 
where TableA.username =  TableB.username  and 
TableB.username = 'ABC'
group by email, TestField

案例2

select email, TestField from TableA 
inner join TableB on TableB.username =  'ABC' 

案例3

declare @uname nvarchar(20);
set @uname = 'ABC';
declare  @Email nvarchar(20);

select  @Email= email from TableA where username =   @uname; 

select  @Email as email , TestField from TableB 
where username = @uname

2 个答案:

答案 0 :(得分:1)

案例2无论如何都会给你一个不同的输出,因为你没有以任何方式加入TableA和TableB,所以你得到了一个笛卡尔积。

由于突然email出现,您需要在案例1中加入:

在案例1中,您只需将查询重写为

即可
SELECT DISTINCT A.Email , B.TestField 
  FROM TableA A join TableB B on A.username = B.Username
 WHERE B.username = 'ABC'

由于您没有多余的GROUP BY子句,因此更易读,更易于维护。

在案例3中,你的where子句中有userId,根据你的帖子,你的tableB中的甚至不是

一般而言,为了可维护性和可读性:

使用显式加入

SELECT * FROM A JOIN B ON A.id = B.id

优于

SELECT * FROM A, B WHERE A.id = B.id

当您需要不同的值而不是所有列的GROUP BY时使用DISTINCT:

SELECT DISTINCT a, b, b FROM TABLE

优于

SELECT a, b, c FROM TABLE GROUP BY a, b, c

答案 1 :(得分:0)

大多数数据库专家会告诉您,交叉产品是邪恶的,应该避免。你的第一个例子可以正常工作。这是一个隐含的内部联接。

你的第二个例子在语法上是不正确的。我怀疑你从MSSQL Server Manager收到错误。你的意思是:

select a.email, b.TestField 
from TableA a inner join TableB b 
  on (b.username = a.username)
where b.username = 'ABC' 

您的第一个示例可能效率更高,因为MSSQL Server足够智能,可以在执行连接之前对TableB.username进行投影。我不太确定在案例2的上述版本中会出现这种情况。

确保你可以这样做:

select a.email, b.TestField 
from TableA a inner join 
  (select * from TableB where TableB.username = 'ABC') b 
on (b.username = a.username)
where b.username = 'ABC' 

希望有所帮助。