SQL - 多个内部联接,最近的

时间:2018-03-23 15:36:54

标签: sql sql-server inner-join

我想知道为什么下面的SQL查询无法正常工作。我试图根据最近的日期返回表1和表2中的字段,并且仅从那些表中具有名称Steve的第三个表中的那些元素返回。

同时,此查询实际上并不会将结果限制为名称为Steve的人。如果我删除第二个内连接并仅关注表1中的字段以限制Universe,它可以正常工作。

感谢您对此的帮助。我正在使用Microsft SQL Server Management Studio。

   Select * 
    From [db].table1
    INNER JOIN [db].table2 ON table1.id=table2.id
    INNER JOIN [db].table3 ON table1.id=table3.id

    WHERE (table1.AsOfDate=(SELECT MAX(AsOfDate) from [db].table1)) 
    and table3.Name = 'Steve' 

2 个答案:

答案 0 :(得分:1)

ID可能不是指所有三个表中的相同ID。你的联接假设是这种情况。我使用示例临时表镜像您的查询,您的查询工作。

--SAMPLE TABLES
IF object_id('tempdb..#table1') is not null drop table #table1
if object_id('tempdb..#table2') is not null drop table #table2
if object_id('tempdb..#table3') is not null drop table #table3

CREATE TABLE #table1 (id INT, my_date date) 
INSERT INTO #table1 (id, my_date) VALUES
(1, '1/1/2018'),
(2, '1/2/2018'),
(3, '1/1/2018')

CREATE TABLE #table2 (id INT, some_field VARCHAR(10)) 
INSERT INTO #table2 (id, some_field) VALUES
(1, 'abc'),
(2, 'xyz'),
(3, 'foo')

CREATE TABLE #table3 (id INT, name VARCHAR(10)) 
INSERT INTO #table3 (id, name) VALUES
(1, 'jon'),
(2, 'steve'),
(3, 'jane')


--QUERY
SELECT * 
FROM #table1 AS x
    INNER JOIN 
    #table2 AS y ON x.id=y.id
    INNER JOIN 
    #table3 AS z ON z.id=x.id
WHERE x.my_date=(SELECT MAX(my_date) from #table1)
    and z.name = 'Steve' 

输出

id  my_date    id   some_field  id  name
2   2018-01-02  2   xyz        2    steve

答案 1 :(得分:0)

我认为最简单的方法是order by

中的窗口函数
Select top (1) with ties . . .  -- list the columns explicitly 
from [db].table1 t1 join
     [db].table2 t2
     on t1.id = t2.id join
     [db].table3 t3
     on t1.id = t3.id
where t3.Name = 'Steve'
order by rank() over (order by t1.AsOfDate);