SQL for Dummies – Dataload Customer bis Organization_Type

Welcome to the POB User Group Online Community! Forums PUG DACH SQL for Dummies – Dataload Customer bis Organization_Type

Viewing 12 posts - 1 through 12 (of 12 total)
  • Author
    Posts
  • #2803

    Hallo Pugler,

    heute benötige ich SQL-Hilfe, die für euch ein Leichtes sein sollte.
    Ich möchte in einer Dataload-Quelle nur die Kontakte selektieren, die in einer Organisation sind, die den Typ ‘Intern’ haben.
    Beide unten dargestellten Varianten geben mir jedoch alle Kontakte aus …

    SELECT  customer.customer_pk as Kontakt
    , organization.id as Organisation
    , organization.Organization_Type_PK as OTyp
    , organization_type.id as OTypId
    FROM Customer
    LEFT JOIN Organization ON customer.organization_pk = organization.organization_pk
    LEFT JOIN Organization_Type ON organization.Organization_Type_PK = Organization_Type.Organization_Type_PK
    LEFT JOIN Organization_Type ot ON ot.id = 'Intern'
    WHERE (customer.Virtual_Bereichsleiterkennzeichen=0 OR customer.Virtual_Bereichsleiterkennzeichen IS NULL)
    SELECT  customer.customer_pk as Kontakt
    , organization.id as Organisation
    , organization.Organization_Type_PK as OTyp
    , organization_type.id as OTypId
    FROM Customer
    LEFT JOIN Organization ON customer.organization_pk = organization.organization_pk
    LEFT JOIN Organization_Type ON organization.Organization_Type_PK = Organization_Type.Organization_Type_PK
    WHERE (customer.Virtual_Bereichsleiterkennzeichen=0 OR customer.Virtual_Bereichsleiterkennzeichen IS NULL)
    AND organization_type.id = 'Intern'

    Vielen Dank für eure Unterstützung!

    #2804
    Stefan Reichelt
    Participant

    Nur schnell überflogen und nicht getestet, sollte aber klappen:

    SELECT  customer.customer_pk as Kontakt
    , organization.id as Organisation
    , organization.Organization_Type_PK as OTyp , organization_type.id as OTypId 
    FROM Customer 
    LEFT JOIN Organization ON customer.organization_pk = organization.organization_pk 
    LEFT JOIN Organization_Type ON organization.Organization_Type_PK = Organization_Type.Organization_Type_PK and Organization_Type.Id='Intern'
    WHERE isnull(customer.Virtual_Bereichsleiterkennzeichen,0)=0

    Der Fehler dürfte im letzten LEFT JOIN liegen. Du hast im ON-Bereich keine weitere Referenz zum customer-Datensatz mitgegeben. Wolltest du den Filter auf den Organisationstyp vielleicht im WHERE ansiedeln? Ich hab es in diesem Beispiel einfach mal mit in den normalen LEFT JOIN gepackt.
    Übrigens würde ich aber immer mit Tabellen-Alias arbeiten, schon der Übersicht wegen.

    #2806

    Gibt leider immer noch alle aus.

    Wie du glaube ich schon erkannt hast, scheint der Bezug zum Customer immer noch zu fehlen?
    Kann man etwas im WHERE etwas benutzen wie customer.organization_pk.organization_type_pk.id = ‘Intern’ – wäre doch irgendwie schöner und schlanker…

    Meinst du mit den Aliasen die ‘as’e weglassen?

    #2807
    Stefan Reichelt
    Participant

    Nein, ich meine es in etwa so:

    SELECT  cus.customer_pk as Kontakt
    , org.id as Organisation
    , ot.Organization_Type_PK as OTyp 
    , ot.id as OTypId 
    FROM Customer cus
    INNER JOIN Organization org ON cus.organization_pk = org.organization_pk 
    INNER JOIN Organization_Type ot ON org.Organization_Type_PK = ot.Organization_Type_PK and ot.Id='Intern'
    WHERE isnull(cus.Virtual_Bereichsleiterkennzeichen,0)=0

    Mit den Tabellenkürzeln siehst du einfach besser durch.
    Ich hab mal auf INNER JOIN umgestellt, dann ist es für dich vielleicht einfacher. Wenn du mit einem LEFT JOIN arbeitest, siehst du natürlich mehr Datensätze als gewünscht, du müsstest dann den WHERE-Bereich deutlich erweitern. Siehe es jetzt besser aus?

    #2809
    Stefan Reichelt
    Participant

    Ach ja, deine letzte Frage hatte ich überlesen: Natürlich kannst du den Filter auf “Intern” in den Where-Bereich verlagern.

    SELECT  cus.customer_pk as Kontakt
    , org.id as Organisation
    , ot.Organization_Type_PK as OTyp 
    , ot.id as OTypId 
    FROM Customer cus
    INNER JOIN Organization org ON cus.organization_pk = org.organization_pk 
    INNER JOIN Organization_Type ot ON org.Organization_Type_PK = ot.Organization_Type_PK
    WHERE 
    isnull(cus.Virtual_Bereichsleiterkennzeichen,0)=0
    and
    ot.Id='Intern'
    #2810

    Ich weiß, dass das Dataload-Log mit Vorsicht zu geniessen ist, kann es sein, dass es die Gesamtzahl der Kontakte als Gelesen anzeigt?
    Dann würde ich aber zumindest die Minderzahl(nur ‘Intern’) als Geändert erwarten …

    #2811
    Stefan Reichelt
    Participant

    Hast du denn die Statements vorher im SQL Management Studio getestet? Ich würde sie erst dann in einer Dataloadquelle verwenden, wenn wirklich nur die gewünschten Resultate erscheinen.

    Wenn dein Mapping stimmt (Sternchen bei customer_pk gesetzt?), sollte die Zahl der gelesenen Datensätze exakt der Zahl der Resultate aus dem SQL Management Studio entsprechen.

    #2812

    Funktioniert alles super heute … oder halt nicht.

    Wollte die tiefe Abfrage umgehen, indem ich in den Kontakten den Kundentyp setze, sodass ich diesen dann später selektieren kann(zusätzlich Stammdatenpflege).

    Dabei stosse ich auf Probleme vom Anfang unserer Dataloads, die wir über die Massenpflege umgangen sind: Selektion funktioniert einwandfrei; dann verknüpfe ich selektiere pk mit pk der customer Tabelle und gebe unten den Standardwert CustomerType = DSGF intern.
    Egal wie ich den Dataload ausführe, der CustomerType wird nicht gesetzt ???

    #2814
    Stefan Reichelt
    Participant

    Der Standardwert wird nur bei neuen Datensätzen gezogen. Wenn du die Spalte überschreiben willst, musst du sie in deiner Quelle fest mitgeben:


    , ‘DSGF intern’ as CustomerType

    und dann im Mapping (-> CustomerType.Id) berücksichtigen.

    #2817

    Das Setzen des Wertes hat nun funktioniert.

    Allerdings gibt Wendia bei der Selektion immer noch alle raus.

    Wir haben im Management Studio dein Statement ausgeführt.
    Dort sind dann allerdings die Spalten org.id und ot.id NULL.

    In Wendia werden sie gefüllt angezeigt – warum?
    Könnte dies, das Problem der Selektion sein?

    #2818
    Stefan Reichelt
    Participant

    Org.id ist NULL, obwohl du mit INNER JOIN arbeitest? Das darf eigentlich nicht sein. Hast du das letzte Statement benutzt, das ich gepostet hatte?

    Hilfreich wären vielleicht noch ein paar Screenshots – von DL-Quelle (idealerweise mit aufgerufenen Vorschau-Datensätzen) und der DL-Definition inklusive Mapping.

    #2819

    Dein Code funktioniert!
    Bei uns hatte sich an anderer Stelle ein Fehler eingeschlichen – Besten Danke!

    Erledigt!

Viewing 12 posts - 1 through 12 (of 12 total)
  • You must be logged in to reply to this topic.