2010-02-04 22 views
3

早上好。我一直在努力解決這個問題一段時間了,我似乎無法圍繞它解決問題。如果連接的表中缺少記錄,則返回SQL中的NULL

所以我在數據庫的兩個表

tblDateTrans 

CREATE TABLE [dbo].[tblDateTrans](
    [Date] [smalldatetime] NOT NULL, 
) 

此表是包含1/1/2007的所有日期的外部日曆表 - 1/1/2011,它也包含像addtional信息假期信息,公司期間等。但這對於這個問題並不重要。

我的第二個表是

tblSurveySession 
    CREATE TABLE [dbo].[tblSurveySession](
     [surveySessionID] [int] IDENTITY(1,1) NOT NULL, 
     [guestID] [int] NULL, 
     [surveyID] [int] NOT NULL, 
     [FK_StoreId] [int] NULL, 
     [surveyCompletedDate] [datetime] NULL 
) 

此表包含在一段時間內送出,並通過我們的客人完成的調查名單。 FK_StoreId是公司的業務單位ID,surveyCompletedDate只包含日期而不包含任何時間。

我的目標是使用tblDateTrans表上的LEFT OUTER JOIN返回surveySessionIDs和日期的列表,我想返回所有日期,無論是否有值。於是,我就運行此查詢:

SELECT  tblDateTrans.Date, dbo.tblSurveySession.surveySessionID, dbo.tblSurveySession.FK_StoreId 
FROM   OPENQUERY([APOLLO], 'select Date FROM apollo.nhcglobal.dbo.tblDateTrans') AS tblDateTrans LEFT OUTER JOIN 
         dbo.tblSurveySession ON tblDateTrans.Date = dbo.tblSurveySession.surveyCompletedDate 
WHERE  (tblDateTrans.Date >= '1/1/2010') AND (tblDateTrans.Date <= '2/1/2010') AND (dbo.tblSurveySession.FK_StoreId = 4) 

我返回的數據看起來像這樣:

Date     surveySessionID  FK_StoreId 
2010-01-01 00:00:00.000  12702   4 
2010-01-01 00:00:00.000  12736   4 
2010-01-01 00:00:00.000  12456   4 
2010-01-03 00:00:00.000  12662   4 
2010-01-04 00:00:00.000  12660   4 
2010-01-05 00:00:00.000  12510   4 
2010-01-05 00:00:00.000  12889   4 
2010-01-24 00:00:00.000  13751   4 
2010-01-25 00:00:00.000  13793   4 
2010-01-28 00:00:00.000  13958   4 
2010-01-30 00:00:00.000  14059   4 
2010-01-31 00:00:00.000  14139   4 

我的目標就是讓查詢返回像這樣的數據:

Date     surveySessionID  FK_StoreId 
2010-01-01 00:00:00.000  12702   4 
2010-01-01 00:00:00.000  12736   4 
2010-01-01 00:00:00.000  12456   4 
2010-01-02 00:00:00.000  NULL   NULL 
2010-01-03 00:00:00.000  12662   4 
2010-01-04 00:00:00.000  12660   4 
2010-01-05 00:00:00.000  12510   4 
2010-01-05 00:00:00.000  12889   4 
2010-01-06 00:00:00.000  NULL   NULL 
2010-01-07 00:00:00.000  NULL   NULL 
2010-01-08 00:00:00.000  NULL   NULL 
2010-01-09 00:00:00.000  NULL   NULL 
2010-01-10 00:00:00.000  NULL   NULL 
2010-01-11 00:00:00.000  NULL   NULL 
2010-01-12 00:00:00.000  NULL   NULL 
2010-01-13 00:00:00.000  NULL   NULL 
2010-01-14 00:00:00.000  NULL   NULL 
2010-01-15 00:00:00.000  NULL   NULL 
2010-01-16 00:00:00.000  NULL   NULL 
2010-01-17 00:00:00.000  NULL   NULL 
2010-01-18 00:00:00.000  NULL   NULL 
2010-01-19 00:00:00.000  NULL   NULL 
2010-01-20 00:00:00.000  NULL   NULL 
2010-01-21 00:00:00.000  NULL   NULL 
2010-01-22 00:00:00.000  NULL   NULL 
2010-01-23 00:00:00.000  NULL   NULL 
2010-01-24 00:00:00.000  13751   4 
2010-01-25 00:00:00.000  13793   4 
2010-01-28 00:00:00.000  13958   4 
2010-01-30 00:00:00.000  14059   4 
2010-01-31 00:00:00.000  14139   4 

我計算出LEFT OUTER JOIN會強制查詢查看所有日期並在缺少surveySessionIDs和FK_StoreIds的日子返回NULLS。我們之前遇到過這樣的問題,因此解決這個問題對我們來說是一個巨大的幫助。謝謝大家的幫助!

+0

我知道這是不相關的,但它不是早上在這裏,這個網站是相當國際化的。 :) – stckvrflw 2010-02-04 14:13:58

+0

由於問題顯然可以無限期地在本網站上查看,所以海報在世界的哪個位置無所謂:在幾個小時內,帖子仍然會在這裏,但對他來說不會是早晨。 – Jay 2010-02-04 14:29:10

回答

4

移動從哪裏來的離開了(dbo.tblSurveySession.FK_StoreId = 4) JOIN的ON條款,如:

LEFT OUTER JOIN dbo.tblSurveySession ON tblDateTrans.Date = dbo.tblSurveySession.surveyCompletedDate AND dbo.tblSurveySession.FK_StoreId = 4 
+0

你是男人!而已! 下面是我使用的查詢: SELECT tblDateTrans.Date,dbo.tblSurveySession.surveySessionID,dbo.tblSurveySession.FK_StoreId FROM OPENQUERY([APOLLO], '選擇日期從apollo.nhcglobal.dbo.tblDateTrans' )AS tblDateTrans LEFT OUTER JOIN dbo.tblSurveySession ON tblDateTrans.Date = dbo.tblSurveySession.surveyCompletedDate AND tblSurveySession。FK_StoreId = 4 WHERE(tblDateTrans.Date> ='1/1/2010')AND(tblDateTrans.Date <='2/1/2010')AND(dbo.tblSurveySession.FK_StoreId = 4或tblSurveySession.FK_StoreId IS NULL) ORDER BY日期 – whobutsb 2010-02-04 14:23:32

2

由於您的WHERE子句,您正在過濾掉一些所需的行。嘗試從此改變你的WHERE子句中,也允許空值,即最後一部分:

AND (dbo.tblSurveySession.FK_StoreId = 4) 

這樣:

AND (dbo.tblSurveySession.FK_StoreId = 4 OR 
    dbo.tblSurveySession.FK_StoreId IS NULL) 
2

反轉的連接方向

SELECT tblDateTrans.Date, dbo.tblSurveySession.surveySessionID, dbo.tblSurveySession.FK_StoreId 
FROM OPENQUERY([APOLLO], 'select Date FROM apollo.nhcglobal.dbo.tblDateTrans') AS tblDateTrans 
LEFT OUTER JOIN dbo.tblSurveySession 
    ON tblDateTrans.Date = dbo.tblSurveySession.surveyCompletedDate 
    AND (dbo.tblSurveySession.FK_StoreId = 4) 
WHERE (tblDateTrans.Date >= '1/1/2010') AND (tblDateTrans.Date <= '2/1/2010') 
相關問題