试着做一个;前1名/按“订购”;在与T-SQL/SQL Server的内部联接中
这是我的用例。我正在尝试联接一个特定表,该表中可能有多条记录要联接 这是我的整个查询,我所说的连接是第一个内部连接:试着做一个;前1名/按“订购”;在与T-SQL/SQL Server的内部联接中,sql,sql-server,tsql,join,inner-join,Sql,Sql Server,Tsql,Join,Inner Join,这是我的用例。我正在尝试联接一个特定表,该表中可能有多条记录要联接 这是我的整个查询,我所说的连接是第一个内部连接: select top 1 a.IN_Notification_ID, a.DI_Surrogate_ID, a.IN_Ref_Content_ID, a.IN_Name, a.IN_Description, a.IN_Category, a.IN_Rank, a.IN_Publish_Date, a.IN_
select top 1
a.IN_Notification_ID,
a.DI_Surrogate_ID,
a.IN_Ref_Content_ID,
a.IN_Name,
a.IN_Description,
a.IN_Category,
a.IN_Rank,
a.IN_Publish_Date,
a.IN_URL_EN,
a.IN_URL_FR,
a.IN_URL_NAME_EN,
a.IN_URL_NAME_FR,
a.IN_HEADER_EN,
a.IN_HEADER_FR,
a.IN_BODY_EN,
a.IN_BODY_FR,
a.IN_ACTION_COMPLETE_URL_EN,
a.IN_ACTION_COMPLETE_URL_FR,
1 as 'IN_COMPLETE',
getdate() as 'ET_LAST_MODIFIED_DATE'
from CXXXXXXX.Important_Notices_Inbox a with (nolock)
inner join CXXXXXXX.IGO_PROFILES b with (nolock) on a.DI_Surrogate_ID = b.email
inner join CXXXXXXX.PI_CONTENTVIEWS c on b.[user_id] = c.[user_id] and a.IN_Ref_Content_ID = c.content_id
where c.[timestamp] > a.[Date_Added]
order by c.[timestamp] desc
因此,您看到的第一个内部联接可以并且可能会返回多个记录(可能有多个记录符合条件a.DI_subrogate_ID=b.email)。理想情况下,我要做的是执行“SELECT TOP 1”/“ORDER BY _CustomObjectKeydesc”,以便只加入具有“最高”CustomObjectKey值的记录。我希望这是有道理的。如何实现这一点?一种方法是使用
行编号()。但是,在SQL Server中,您可以使用横向联接——它使用apply
keywork。因此,from
子句的如下所示:
from C1397722.Important_Notices_Inbox a with (nolock) cross apply
(select top 1 b.*
from C1397722.IGO_PROFILES b with (nolock)
where a.DI_Surrogate_ID = b.email
order by _CustomObjectKey desc
) b inner join
CXXXXXXX.PI_CONTENTVIEWS c
on b.[user_id] = c.[user_id] and a.IN_Ref_Content_ID = c.content_id
注意:我建议您使用表格缩写作为列别名。在您的情况下,ini
而不是a
和p
而不是b
。这使得查询更易于阅读和维护。您还可以使用ROW\u NUMBER()函数,该函数具有DI\u代理项ID上的partition by和order by\u CustomObjectKey desc
WITH cte_data AS
(
select top 1
a.IN_Notification_ID,
a.DI_Surrogate_ID,
a.IN_Ref_Content_ID,
a.IN_Name,
a.IN_Description,
a.IN_Category,
a.IN_Rank,
a.IN_Publish_Date,
a.IN_URL_EN,
a.IN_URL_FR,
a.IN_URL_NAME_EN,
a.IN_URL_NAME_FR,
a.IN_HEADER_EN,
a.IN_HEADER_FR,
a.IN_BODY_EN,
a.IN_BODY_FR,
a.IN_ACTION_COMPLETE_URL_EN,
a.IN_ACTION_COMPLETE_URL_FR,
1 as 'IN_COMPLETE',
getdate() as 'ET_LAST_MODIFIED_DATE',
ROW_NUMBER() OVER (PARTITION BY DI_Surrogate_ID order by _CustomObjectKey desc) as rn
from C1397722.Important_Notices_Inbox a with (nolock)
inner join C1397722.IGO_PROFILES b with (nolock) on a.DI_Surrogate_ID = b.email
inner join CXXXXXXX.PI_CONTENTVIEWS c on b.[user_id] = c.[user_id] and a.IN_Ref_Content_ID = c.content_id
where c.[timestamp] > a.[Date_Added]
order by c.[timestamp] desc
)
SELECT * from cte_data where rn = 1
作为补充说明,在继续到处散布NOLOCK提示之前,您可能会阅读本文。