特定列上的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内部联接的主要内容,如果未能解决你的问题,请参考以下文章

SQL:在连接后获取列上的特定行值

Sql Server CE - 临时禁用特定列上的自动增量

LIKE sqldf 上的内部联接

Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)

使用 XPath/XQuery 过滤 XML 列上的 SQL 查询

在多列上组合 sql 内部和外部联接