Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试着做一个;前1名/按“订购”;在与T-SQL/SQL Server的内部联接中_Sql_Sql Server_Tsql_Join_Inner Join - Fatal编程技术网

试着做一个;前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提示之前,您可能会阅读本文。