2016-06-02 9 views
0

Ich versuche zu ermitteln, warum ich mehrere Ergebnisse von dieser Abfrage bekomme. Ich muss sicherstellen, dass ich nur 1 Ergebnis pro UserId habe.Abfrage, die mehrere Ergebnisse zurückgibt. Nur erwartet 1.

declare @UserId INT = 1 

    SELECT u.UserId, 
      cfeLead.ElementName AS 'LeadSource' , 
      rt.ReferralType AS 'MarketingSource' , 
      cfe.ElementName AS 'Corporate' 
    FROM Users u 
      LEFT JOIN ReferralType rt ON rt.ReferralTypeID = u.ReferralTypeID 
      LEFT JOIN UserCustomFields ucf ON ucf.UserID = u.UserID 
      LEFT JOIN CustomFields cf ON cf.CustomFieldID = ucf.CustomFieldID 
             AND (cf.CustomFieldName = 'Corporate' OR cf.CustomFieldName = 'Corporate Membership') 
      LEFT JOIN CustomFieldElements cfe ON cfe.CustomFieldID = cf.CustomFieldID 
               AND ucf.CustomFieldElementID = cfe.CustomFieldElementID 
      LEFT JOIN CustomFields cfLead ON cfLead.CustomFieldID = ucf.CustomFieldID 
             AND cfLead.CustomFieldName = 'Lead Source' 
      LEFT JOIN CustomFieldElements cfeLead ON cfeLead.CustomFieldID = cfLead.CustomFieldID 
               AND ucf.CustomFieldElementID = cfeLead.CustomFieldElementID 
    WHERE u.UserID = @UserId 

Mein Ergebnis zeigt:

UserId  LeadSource MarketingSource Corporate 
1   NULL   DirectMail  180 Center 
1   Walkin  DirectMail  NULL 

Ich mag würde, um zu sehen:

UserId  LeadSource MarketingSource Corporate 
1   Walkin  DirectMail  180 Center 

Meine Vermutung ist, dass die Multiple Linke tritt dies verursachen, aber ich kann nicht scheinen, um das zu verfolgen. Vielen Dank im Voraus.

+2

Kommentieren Sie alle Join-Bedingungen und versuchen Sie, die Kommentare nacheinander zu entfernen, um herauszufinden, welcher in mehreren Zeilen resultiert –

Antwort

0

Okay, so dauerte es ein wenig länger, als ich es wollte, aber ich wollte meine Antwort schreiben.

declare @UserId INT = 1 

    SELECT u.UserId, 
     MAX(cfeLead.ElementName) AS 'LeadSource' , 
     MAX(rt.ReferralType) AS 'MarketingSource' , 
     MAX(cfe.ElementName) AS 'Corporate' 
    FROM Users u 
     LEFT JOIN ReferralType rt ON rt.ReferralTypeID = u.ReferralTypeID 
     LEFT JOIN UserCustomFields ucf ON ucf.UserID = u.UserID 
     LEFT JOIN CustomFields cf ON cf.CustomFieldID = ucf.CustomFieldID 
            AND (cf.CustomFieldName = 'Corporate' OR cf.CustomFieldName = 'Corporate Membership') 
     LEFT JOIN CustomFieldElements cfe ON cfe.CustomFieldID = cf.CustomFieldID 
              AND ucf.CustomFieldElementID = cfe.CustomFieldElementID 
     LEFT JOIN CustomFields cfLead ON cfLead.CustomFieldID = ucf.CustomFieldID 
            AND cfLead.CustomFieldName = 'Lead Source' 
     LEFT JOIN CustomFieldElements cfeLead ON cfeLead.CustomFieldID = cfLead.CustomFieldID 
              AND ucf.CustomFieldElementID = cfeLead.CustomFieldElementID 
    WHERE u.UserID = @UserId 
    GROUP BY u.UserId 

Dies funktioniert wie ein Charme.

1

Verwenden Coalesce

declare @UserId INT = 1 

    SELECT distinct u.UserId, 
      Coalesce(cfeLead.ElementName, cfe.ElementName) AS 'LeadSource' , 
      rt.ReferralType AS 'MarketingSource' , 
      Coalesce(cfe.ElementName, cfeLead.ElementName) AS 'Corporate' 
    FROM Users u 
      LEFT JOIN ReferralType rt ON rt.ReferralTypeID = u.ReferralTypeID 
      LEFT JOIN UserCustomFields ucf ON ucf.UserID = u.UserID 
      LEFT JOIN CustomFields cf ON cf.CustomFieldID = ucf.CustomFieldID 
             AND (cf.CustomFieldName = 'Corporate' OR cf.CustomFieldName = 'Corporate Membership') 
      LEFT JOIN CustomFieldElements cfe ON cfe.CustomFieldID = cf.CustomFieldID 
               AND ucf.CustomFieldElementID = cfe.CustomFieldElementID 
      LEFT JOIN CustomFields cfLead ON cfLead.CustomFieldID = ucf.CustomFieldID 
             AND cfLead.CustomFieldName = 'Lead Source' 
      LEFT JOIN CustomFieldElements cfeLead ON cfeLead.CustomFieldID = cfLead.CustomFieldID 
               AND ucf.CustomFieldElementID = cfeLead.CustomFieldElementID 
    WHERE u.UserID = @UserId 

bei der Verwendung von LEFT JOIN und Sie wollen UN-NULL-Werte, verwenden Coalesce über alle verknüpften Tabellen

+0

Das tut es nicht. Das gibt mir tatsächlich noch 2 Ergebnisse, die wie folgt aussehen: 'UserId LeadSource MarketingSource Corporate 1 180 Center DirectMail 180 Center 1 Walkin DirectMail Walkin' – akaWizzmaster

+0

habe ich die Felder von rechten Aliase in Coalesce? – FLICKER

+0

Ja, aber ich habe das Gefühl, dass das Problem in den vielen linken Joins liegt. Es scheint nur seltsam. – akaWizzmaster

1

ich fast sicher bin, dass das Mischen von Prädikaten mit bedingtem Joinvergleichselemente ist die Wurzel deines Problems. Wenn ich richtig bin, dann wird der folgende Code sollte korrekt arbeiten und zurück nur eine Zeile:

DECLARE @UserId INT = 1 

SELECT u.UserId 
, cfeLead.ElementName AS 'LeadSource' 
, rt.ReferralType AS 'MarketingSource' 
, cfe.ElementName AS 'Corporate' 
    FROM Users u 
    LEFT JOIN ReferralType rt ON rt.ReferralTypeID = u.ReferralTypeID 
    LEFT JOIN UserCustomFields ucf ON ucf.UserID = u.UserID 
    LEFT JOIN CustomFields cf ON cf.CustomFieldID = ucf.CustomFieldID 
    LEFT JOIN CustomFieldElements cfe 
     ON cfe.CustomFieldID = cf.CustomFieldID 
     AND ucf.CustomFieldElementID = cfe.CustomFieldElementID 
    LEFT JOIN CustomFields cfLead ON cfLead.CustomFieldID = ucf.CustomFieldID 
    LEFT JOIN CustomFieldElements cfeLead 
     ON cfeLead.CustomFieldID = cfLead.CustomFieldID 
     AND ucf.CustomFieldElementID = cfeLead.CustomFieldElementID 
    WHERE u.UserID = @UserId 
     AND (cf.CustomFieldName = 'Corporate' 
      OR cf.CustomFieldName = 'Corporate Membership') 
     AND cfLead.CustomFieldName = 'Lead Source' 
+0

Das liefert jetzt eigentlich nichts zurück. – akaWizzmaster

Verwandte Themen