您好我很困惑三个场景,几乎每个项目都会使用这三个场景。
我想知道哪一个会有效符合 - 更少的时间复杂性 - 效率
- 有效性
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
答案 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'
希望有所帮助。