sql-如何从连接多个表中选择只有一个不同列的多个列

sql-如何从连接多个表中选择只有一个不同列的多个列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在使用SQL Server。我想选择只有一个不同列的多个列 比如说, 表1: ID NAME ...(other columns) 1 A 2 B 3 C 表2(ID和编号一起是唯一键): 表3: Name Company ...(other columns) A Amazon B Google C Amazon 上面的每个表都有许多列(多于2列)。如何获得结果,使结果中只有5列

我正在使用SQL Server。我想选择只有一个不同列的多个列

比如说,

表1:

ID    NAME  ...(other columns)
 1     A
 2     B
 3     C
表2(ID和编号一起是唯一键):

表3:

Name  Company       ...(other columns)
 A      Amazon    
 B      Google   
 C      Amazon    
上面的每个表都有许多列(多于2列)。如何获得结果,使结果中只有5列,而没有其他“无用”列,ID列是不同的列

更具体地说,比如, 我的常规sql语句如下所示:

select distinct ID, NAME, NUMBER, COMPANY, Year
from table1
left join table2 on table1.ID = table2.ID
left join table3 on table1.name = table3.name
group by ID, NAME, NUMBER, COMPANY, year
order by ID desc, Year desc
ID   NAME NUMBER        COMPANY  YEAR
1    A     111          Amazon   2011
2    B     12345678     google   2011
2    B     22222222     google   2012
3    c     333          Amazon   2013
ID   NAME NUMBER        COMPANY  YEAR
1    A     111          Amazon   2011
2    B     22222222     google   2012
3    c     333          Amazon   2013   
这将输出以下内容:

select distinct ID, NAME, NUMBER, COMPANY, Year
from table1
left join table2 on table1.ID = table2.ID
left join table3 on table1.name = table3.name
group by ID, NAME, NUMBER, COMPANY, year
order by ID desc, Year desc
ID   NAME NUMBER        COMPANY  YEAR
1    A     111          Amazon   2011
2    B     12345678     google   2011
2    B     22222222     google   2012
3    c     333          Amazon   2013
ID   NAME NUMBER        COMPANY  YEAR
1    A     111          Amazon   2011
2    B     22222222     google   2012
3    c     333          Amazon   2013   
我想要的实际上是:

select distinct ID, NAME, NUMBER, COMPANY, Year
from table1
left join table2 on table1.ID = table2.ID
left join table3 on table1.name = table3.name
group by ID, NAME, NUMBER, COMPANY, year
order by ID desc, Year desc
ID   NAME NUMBER        COMPANY  YEAR
1    A     111          Amazon   2011
2    B     12345678     google   2011
2    B     22222222     google   2012
3    c     333          Amazon   2013
ID   NAME NUMBER        COMPANY  YEAR
1    A     111          Amazon   2011
2    B     22222222     google   2012
3    c     333          Amazon   2013   
我想要没有重复ID的结果。如果有重复ID,我只想显示最新的ID。在上面的示例中,ID2在表2中有2行。我想展示一个最新日期是2012年。
我怎样才能做到这一点。提前感谢。

您可以使用
不存在
仅选择每个id的最新行(其中不存在具有相同id和更大年份的另一行)

使用分析函数(这应该比上面的查询更快)

编辑:应用于您的表格

select t2.id, t3.name, t2.number, t3.company, t2.year from
(
    select * from 
    (select *,
      row_number() over(partition by id order by year desc) rn
      from table2
    ) t1 where rn = 1
) t2 join table1 t1 on t2.id = t1.id
join table3 t3 on t3.name = t1.name

我使用了子查询,注意子查询效率很低

select distinct t1.ID, t1.NAME, t2.NUMBER, t3.COMPANY, t2.Year
from table1 t1
left join table2 t2 on t1.ID = t2.ID                        
inner join table3 t3 on t1.name = t3.name --inner join to select the latest record only
                    and t2.Year = (Select MAX(year) from table2 t22 
                                     where t22.ID = t2.Id group by ID)    
group by t1.ID, t1.NAME, t2.NUMBER, t3.COMPANY, t2.year
order by t1.ID, t2.Year desc
编辑:使用更高效的CTE

WITH CTE as 
(
Select Id, MAX(year) as [yr] from table2 t2 group by ID
) 
select distinct t1.ID, t1.NAME, t2.NUMBER, t3.COMPANY, t2.Year
from table1 t1
left join table2 t2 on t1.ID = t2.ID                        
left join table3 t3 on t1.name = t3.name
inner join CTE on cte.yr = t2.Year
                  and t2.Id = CTE.Id            
group by t1.ID, t1.NAME, t2.NUMBER, t3.COMPANY, t2.year
order by t1.ID, t2.Year desc

为什么你有两个“谷歌”?不同的选择正在查看数字,您有两个不同的数字。