特定列上的SQL内部联接
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了特定列上的SQL内部联接相关的知识,希望对你有一定的参考价值。
我正在尝试在共享相同列名的2个表上使用Inner join。第一个表是临时表,但列名等于其他表主键列名。如何在不更改列名称的情况下在它们之间进行连接(当然在临时表中)?
SELECT * FROM [dbo].[Apps]
INNER JOIN #statsForManagerApps on [Apps].[AppId] = #statsForManagerApps.AppId
WHERE AppId IN
(SELECT AppId FROM [AppsForManagers] WHERE [Managerid] = @ManagerId) AND [Enabled]=1
这就是我的加入的样子。使用*因为我需要Apps表中的所有数据。
答案
您需要在WHERE
子句中指定表:
WHERE Apps.AppId IN
您还可以对表进行别名,如下所示:
SELECT * FROM [dbo].[Apps] App
INNER JOIN #statsForManagerApps on App.AppId = #statsForManagerApps.AppId
WHERE App.AppId IN
(SELECT AppId FROM [AppsForManagers] WHERE [Managerid] = @ManagerId) AND [Enabled]=1
另一答案
您希望使用表别名进行连接。这也将使查询更容易阅读:
SELECT a.*
FROM [dbo].[Apps] a INNER JOIN
#statsForManagerApps sfm
on [Apps].[AppId] = sfm.AppId
WHERE a.AppId IN (SELECT AppId FROM [AppsForManagers] WHERE [Managerid] = @ManagerId) AND
[Enabled]=1 ;
另一答案
您应该使用表别名指定所有列,如下所示
SELECT A.col1,A.col2, TA.col1,TA.col2
FROM [dbo].[Apps] A
INNER JOIN #statsForManagerApps TA on A.AppId = TA.AppId
WHERE A.AppId IN (SELECT AppId FROM [AppsForManagers] WHERE [Managerid] = @ManagerId)
AND A.Enabled=1
如果你真的不能使用表名(如你所说的30列)尝试使用下面的select
语句而不是上面的语句:
SELECT *
要么
SELECT A.*, TA.*
另一答案
尝试指定要使用的AppId列:
SELECT * FROM [dbo].[Apps]
INNER JOIN #statsForManagerApps
ON [Apps].[AppId] = #statsForManagerApps.AppId
WHERE [Apps].AppId IN
( SELECT [AppsForManagers].AppId FROM [AppsForManagers]
WHERE [Managerid] = @ManagerId
)
AND [Enabled]=1
以上是关于特定列上的SQL内部联接的主要内容,如果未能解决你的问题,请参考以下文章
Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)