【问题标题】:MS SQL SERVER 2008 RS OUTER APPLY and empty RSMS SQL SERVER 2008 RS OUTER APPLY 和空 RS
【发布时间】:2016-03-20 09:45:07
【问题描述】:

我的第一个问题长期潜伏在这里。

我有以下表格:

  • 帐户
  • 电子邮件
  • 电话号码

我想从 Accounts 中获取所有内容,对于每条 Accounts 记录,从 Emails 和 PhoneNumbers 中获取最新的 Top 1,其中 Accounts.ID = Emails.AcctID 或 Accounts.ID = PhoneNumbers.AcctID。

我的 RS 目前是: 从帐户中选择 ACCT.* 作为 ACCT OUTER APPLY(从电子邮件中选择前 1 个 E.* 作为 E.E_AcctID = ACCT.ACCT_ID ORDER BY E.E_ID DESC)EM OUTER APPLY(从电话号码中选择前 1 个 PH.* 作为 PH WHERE PH.PH_AcctID = ACCT.ACCT_ID ORDER BY PH_ID DESC) PH WHERE ACCT.ACCT_Status > 2;

问题在于并非每个帐户在电子邮件或电话号码中都有相应的记录。

所以,一些 APPLY RS 是空的,然后我收到这个 RS 错误:ADODB.Recordset error '800a0cc1' Item cannot be found in the collection对应于请求的名称或序号。

知道如何处理空记录集吗?

提前非常感谢。干杯,诺亚

【问题讨论】:

  • 1) 标记正在使用的 dbms(我猜它应该是 sql server)2) 发布一些示例数据 3) 发布您的尝试到目前为止
  • 正如@vkp 所说,更多数据会很有用。话虽如此,根据我的经验,加入窗口函数比外部应用更快,并且应该只返回空值。
  • 感谢您的反馈!将根据您的建议进行更新。干杯,N
  • user2538042,我怎样才能使用 JOINS 并且仍然只能从每个连接的表中获取 TOP 1 记录?

标签: sql sql-server tsql join outer-apply


【解决方案1】:

问题解决了!!

我将 RS 开头的“ACCT.*”替换为“*”,这样就成功了。我无意中排除了其他表!

感谢所有观看和评论的人!

【讨论】:

    【解决方案2】:

    假设您在每个表中都有一个 created_datetime 列来指定最近的行,我们可以使用 RowNumber 函数来完成这项工作,请参阅此示例

    declare @ACCOUNTS table (ID_ACC int)
    declare @EMAILS table (EMAIL VARCHAR(50), ID_ACC int, CREATED_DATETIME DATETIME)
    declare @PHONES table (PHONE VARCHAR(50), ID_ACC int, CREATED_DATETIME DATETIME)
    
    
    insert into @ACCOUNTS
    SELECT '1' ID_ACC
    UNION ALL 
    SELECT '2' ID_ACC
    UNION ALL 
    SELECT '3' ID_ACC
    
    INSERT INTO @EMAILS
    SELECT 'MyEmail@test.com' EMAIL,'1' ID_ACC, '2015-12-14 22:00:00' CREATED_DATETIME
    UNION ALL 
    SELECT 'MyNewemail@test.com' EMAIL,'1' ID_ACC, '2015-12-14 22:53:00'
    UNION ALL 
    SELECT '3rdemail@test.com' EMAIL,'3' ID_ACC, '2015-12-14 22:54:00'
    UNION ALL 
    SELECT 'NEW3rdemail@test.com' EMAIL,'3' ID_ACC, '2015-12-14 22:55:30'
    
    
    INSERT INTO @PHONES
    SELECT '00213555555' PHONE,'1' ID_ACC, '2015-12-14 22:10:00' CREATED_DATETIME
    UNION ALL 
    SELECT '00213554444' PHONES,'2' ID_ACC, '2015-12-14 22:54:00'
    UNION ALL 
    SELECT '00213556666' PHONES,'3' ID_ACC, '2015-12-14 22:54:00'
    UNION ALL 
    SELECT '00213557777' PHONES,'3' ID_ACC, '2015-12-14 23:10:00'
    
     SELECT 
     *
     FROM
     (SELECT 
     ROW_NUMBER () over (partition by A.ID_ACC order by E.CREATED_DATETIME DESC,P.CREATED_DATETIME DESC) AS ROW_ORDER,
     A.ID_ACC,
     E.EMAIL,
     P.PHONE
     FROM @ACCOUNTS as A
     left join @EMAILS as E
     on A.ID_ACC=E.ID_ACC
     left join @PHONES as P
     on A.ID_ACC=P.ID_ACC) AS TAB
     WHERE TAB.ROW_ORDER=1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多