Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

(Spezielle) SQL Abfrage

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Generic1, 14 Juli 2014.

  1. Generic1

    Generic1 Benutzer

    Hallo,

    ich hab ein spezielles problem mit einer SQL- Abfrage (MS SQL 2012)
    Ich habe eine Tabelle CUSTOMER , eine Tabelle CONTACTS und eine Tabelle E_MAILS.
    Ich bräuchte jetzt eine Abfrage, bei der ich:

    1. den Customer bekomme wenn er keine Emial adresse hat (deswegen mein LEFT JOIN)
    2. wenn der customer mehrere email- Adressen hat, möchte ich den Customer nur ein mal im ResultSet (deshalb der Subselect).

    Mein Problem ist jetzt, dass sich 1. und 2. ausschließen.
    Was kann ihc da noch machen. Ich will es nicht über den Applikationscode lösen, da das bei sehr vielen Einträgen in der Applikation sehr teuer werden kann.

    Kann man da noch was machen - bin sehr dankbar für jeden hinweis.

    Beste Grüße,
    Generic1


    SELECT
    bc.ID,
    e.E_MAIL_ADR
    -- usw
    FROM
    CUSTOMERS bc JOIN LOCATIONS l ON bc.LOCATION_ID = l.ID
    JOIN CONTACTS c ON bc.ID = c.CUSTOMER_ID
    LEFT JOIN E_MAILS e ON e.CONTACT_ID = c.ID -- left join - also get customer if he has no email address
    where
    e.E_MAIL_ADR IN (select MAX(e.E_MAIL_ADR) FROM CUSTOMERS pc JOIN CONTACTS c ON pc.ID = c.CUSTOMER_ID
    LEFT JOIN E_MAILS e ON e.CONTACT_ID = c.ID
    GROUP BY pc.ID) -- get only one customer if he has more than one email address
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ohne mir Deinen Kot da näher anzuschauen ist ein LEFT JOIN schon okay - gegen eine Tabelle, die max. einen Datensatz je costumer liefert. Distinct und Co. sind Deine Freunde.
     
  3. ukulele

    ukulele Datenbank-Guru

    Ich denke mal du brauchst das hier (gibt sicher auch noch andere Wege):
    Code:
    SELECT    *
    FROM    tabelle1
    LEFT JOIN (
    SELECT    ROW_NUMBER() OVER (PARTITION BY fk_tabelle1 ORDER BY beliebige_spalte) AS zeilennr,
            *
    FROM    tabelle2
    ) t2
    ON        t2.fk_tabelle1 = t1.pk
    WHERE    t2.zeilennr IS NULL
    OR        t2.zeilennr = 1
    Da hab ich es jetzt nur mit zwei Tabellen gemacht aber das sollte sich anpassen lassen.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden