左联接结合GETDATE()

时间:2019-12-05 11:21:22

标签: sql sql-server tsql

我有下面的表,我试图从表A到表B LEFT JOIN来获得CodeTime。问题是我为每个代码获得多行。我想得到的是每个Code都带有Time的一行,这比我对GETDATE()的排序要少。

表格:

enter image description here

代码:

SELECT
      [ID],
      Date_Time
    FROM Table_A
    LEFT JOIN Table_B
      ON A.ID = B.Project_Code

2 个答案:

答案 0 :(得分:2)

您可以使用apply

select a.*, b.*
from a cross apply
     (select top (1) b.*
      from b
      where b.code = a.code and b.time < getdate()
      order by b.time desc
     ) b;

这假设time实际上是datetime。如果您只想比较时间,请使用convert(time, getdate())

答案 1 :(得分:0)

您需要添加一个额外的join子句以仅从指定的<addForeignKeyConstraint baseColumnNames="id" baseTableName="profile" constraintName="fk_profile_user_id" referencedColumnNames="id" referencedTableName="jhi_user" onDelete="CASCADE" /> 之前返回表中的记录,然后只需使用DATETIME即可获取最新的记录:

MAX

如果列SELECT a.[ID], Date_Time = MAX(b.Date_Time) FROM Table_A AS a LEFT JOIN Table_B AS b ON b.Project_Code = a.ID AND b.Date_Time < GETDATE() GROUP BY a.ID; 使用Date_time数据类型(您的示例数据表明使用了该类型,但列名表明没有使用),那么您需要将TIME转换为时间:

GETDATE()

如果还需要从SELECT a.[ID], Date_Time = MAX(b.Date_Time) FROM Table_A AS a LEFT JOIN Table_B AS b ON b.Project_Code = a.ID AND b.Date_Time < CONVERT(TIME, GETDATE()) GROUP BY a.ID; 返回的其他列,则将需要使用Table_B或具有排名功能的子查询。

外部申请

OUTER APPLY

具有排名功能的子查询

SELECT  a.[ID],
        b.Date_Time,
        b.SomeOtherColumn
FROM    Table_A AS a
        OUTER APPLY
        (   SELECT  TOP 1 b.Date_Time, b.SomeOtherColumn
            FROM    Table_B AS b
            WHERE   A.ID = B.Project_Code
            AND     b.Date_Time < GETDATE()
            ORDER BY b.Date_Time DESC
        ) AS b;