2010-02-04 7 views
3

Good Morning All. J'ai lutté avec ce problème pendant un moment maintenant, et je ne peux pas sembler m'en passer la tête.Renvoyer des valeurs NULL en SQL si la table jointe ne contient pas d'enregistrements pour cette date

J'ai donc deux tables dans ma base de données

tblDateTrans 

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

Ce tableau est une table de calendrier externe qui contient toutes les dates de 1/1/2007 - 1/1/2011, il contient également des informations addtional comme informations de vacances, période de l'entreprise, etc. Mais ce n'est pas important pour cette question.

Ma deuxième table est

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 
) 

Ce tableau contient une liste des questionnaires envoyés et remplis par nos clients sur une période de temps. FK_StoreId est l'ID de l'unité de gestion de l'entreprise et surveyCompletedDate ne contient que des dates et aucune heure.

Mon but est de retourner une liste de surveySessionIDs et de dates en utilisant un LEFT OUTER JOIN sur la table tblDateTrans, je voudrais retourner toutes les dates sans tenir compte des valeurs. J'ai donc essayé d'exécuter cette requête:

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) 

Mon retour des données ressemble à ceci:

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 

Mon but est d'avoir la requête renvoie les données comme ceci:

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 

I figuré une LEFT OUTER JOIN forcerait la requête à regarder toutes les dates et retourner NULLS sur les jours qui manquent surveySessionIDs et FK_StoreIds. Nous avons déjà rencontré ce genre de problème avec d'autres projets, ce qui nous aiderait énormément dans le futur. Merci à tous pour votre aide!

+0

Je sais que ce n'est pas lié mais ce n'est pas le matin ici, ce site est assez international. :) – stckvrflw

+0

Comme les questions restent apparemment disponibles pour être affichées sur ce site indéfiniment, peu importe où dans le monde l'affiche est: Dans quelques heures, le poste sera toujours là, mais ce ne sera pas le matin pour lui non plus . – Jay

Répondre

4

déplacer la (dbo.tblSurveySession.FK_StoreId = 4) de la WHERE à la clause de LEFT JOIN ON, comme:

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

VOUS L'HOMME! C'est tout! Voici la requête que j'utilise: SELECT tblDateTrans.Date, dbo.tblSurveySession.surveySessionID, dbo.tblSurveySession.FK_StoreId DE OPENQUERY ([APOLLO], 'sélectionner une date apollo.nhcglobal.dbo.tblDateTrans') AS tblDateTrans LEFT OUTER JOIN dbo.tblSurveySession ON tblDateTrans.Date = dbo.tblSurveySession.surveyCompletedDate ET tblSurveySession.FK_StoreId = 4 WHERE (tblDateTrans.Date> = '1/1/2010') ET (tblDateTrans.Date <= '2/1/2010') ET (dbo.tblSurveySession.FK_StoreId = 4 OU tblSurveySession.FK_StoreId est NULL) COMMANDER PAR Date – whobutsb

2

Vous supprimez certaines des lignes souhaitées en raison de votre clause WHERE. Essayez de changer la dernière partie de votre clause WHERE pour permettre également NULLs, soit de ceci:

AND (dbo.tblSurveySession.FK_StoreId = 4) 

à ceci:

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

Inverser la jonction direction

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')