2015-12-14 72 views
1

這是我的第一個問題。MS SQL SERVER 2008 RS OUTER APPLY and empty RS

我有以下表格:

  • 賬戶
  • 電子郵件
  • PHONENUMBERS

我想抓住一切從帳戶,併爲每個帳戶記錄,最近的頂部1從電子郵件和PhoneNumbers其中Accounts.ID = Emails.AcctID或Accounts.ID = PhoneNumbers.AcctID。

我的RS是目前: SELECT ACCT * FROM帳戶AS ACCT OUTER APPLY(SELECT TOP 1 E. * FROM電子郵件AS e其中E.E_AcctID = ACCT.ACCT_ID ORDER BY E.E_ID DESC)EM OUTER APPLY(。 SELECT TOP 1 PH。* FROM PhoneNumbers AS PH WHERE PH.PH_AcctID = ACCT.ACCT_ID ORDER BY PH_ID DESC)PH WHERE ACCT.ACCT_Status> 2;

問題是,並非每個帳戶在電子郵件或電話號碼中都有對應的記錄。

因此,一些應用RS回來空,然後我得到此RS錯誤:ADODB.Recordset錯誤'800a0cc1'項目無法找到對應於請求的名稱或序號的集合中。

任何想法如何能解決空記錄集?

非常感謝提前。乾杯,諾亞

+1

1)標籤所使用的數據庫管理系統(我猜應該是sql server)2)發佈一些示例數據3)發佈您的嘗試到目前爲止 –

+0

正如@vkp所說,更多的數據將會有用。據說,根據我的經驗,加入窗口函數比外部函數更快,應該返回空值。 –

+0

感謝您的反饋!將更新您的建議。乾杯,N – nbardach

回答

0

問題解決!!

我在RS的開頭用「*」取代了「ACCT。*」,這就實現了。我無意中排除了其他表格!

感謝所有看過並評論過的人!

0

假設你在每個表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 '[email protected]' EMAIL,'1' ID_ACC, '2015-12-14 22:00:00' CREATED_DATETIME 
UNION ALL 
SELECT '[email protected]' EMAIL,'1' ID_ACC, '2015-12-14 22:53:00' 
UNION ALL 
SELECT '[email protected]' EMAIL,'3' ID_ACC, '2015-12-14 22:54:00' 
UNION ALL 
SELECT '[email protected]' 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