根据公共列从多个表中选择不同的列

时间:2017-07-30 08:27:36

标签: sql

如何将以下表格合并到此结果中?

结果应该是非常idUnit的一行,其最新日期与表2匹配该行的匹配ID。

我设法将表格合并,但不是基于最新日期。

示例数据:

Table1
id    idUnit    Date                  extra
1     1         2017-01-23 01:00:00   a
2     1         2017-01-23 02:00:00   b
3     2         2017-01-23 01:00:00   c
4     2         2017-01-23 02:00:00   d


Table2
id    date                   extra2
1     2017-01-23 01:00:00    w
2     2017-01-23 02:00:00    x
3     2017-01-23 01:00:00    y
4     2017-01-23 02:00:00    z


Result
id    idUnit    Date                  extra    extra2
2     1         2017-01-23 02:00:00   b        x
4     2         2017-01-23 02:00:00   d        z

3 个答案:

答案 0 :(得分:0)

请使用现代JOIN语法,而不是使用逗号分隔的表格与WHERE。

所以你的SQL变成了

select t1.id, t1.idUnit, MAX(t1.date), t1.?, t2.? from table1 t1 INNER JOIN table2 t2 
ON t1.id = t2.id and t1.date = t2.date
GROUP BY t1.id, t1.idUnit, t1.?, t2.?

请注意,您必须在GROUP BY中包含所需的所有其他字段(我有t1。?和t2。?作为占位符)

修改

看过示例数据后,请尝试以下操作。如果您使用的是SQL Server,则可以复制整个内容并粘贴到查询窗口中。下面使用的相同类型的子查询方法可以在任何db中完成。

declare @table1 table
(
id int,
idUnit int,
tDate datetime,
extraCol varchar(10)
)
declare @table2 table
(
id int,
tDate datetime,
extraCol varchar(10)
)
INSERT INTO @table1 VALUES(1, 1, '2017-01-23 01:00:00', 'a')
INSERT INTO @table1 VALUES(2, 1, '2017-01-23 02:00:00', 'b')
INSERT INTO @table1 VALUES(3, 2, '2017-01-23 01:00:00', 'c')
INSERT INTO @table1 VALUES(4, 2, '2017-01-23 02:00:00', 'd')

INSERT INTO @table2 VALUES(1, '2017-01-23 01:00:00', 'w')
INSERT INTO @table2 VALUES(2, '2017-01-23 02:00:00', 'x')
INSERT INTO @table2 VALUES(3, '2017-01-23 01:00:00', 'y')
INSERT INTO @table2 VALUES(4, '2017-01-23 02:00:00', 'z')

SELECT t1.id, t1.idUnit, t1.tDate, t1.extraCol, t2.extraCol FROM @table1 t1
INNER JOIN @table2 t2 ON t1.id = t2.id and t1.tDate = t2.tDate
INNER JOIN
(SELECT idUnit,  MAX(tDate) as maxDate FROM @table1 
GROUP By idUnit) m
ON t1.idUnit = m.idUnit and t1.tDate = m.maxDate
ORDER BY id

答案 1 :(得分:0)

试试这个。在这里,这两个表使用Inner join连接。

 SELECT MAX(t1.date) FROM table1 INNER JOIN table2
 ON table2.id = table1.id and table1.date= table2.date;

答案 2 :(得分:0)

实际上你的问题主要是关于如何获得每个idUnit的Max(id) - 之后,Join只是根据ID列(简单的内部连接) 如果您的数据库支持它,最简单的解决方案是使用窗口函数(按日期按IDUnit顺序分区)

如果您的数据库尚不支持它(如MySQL 5.7),那么您可以使用一些嵌套查询来查找每个idUnit的最大日期行。 (注意它通常要慢得多......)

的问候,
尊利