2016-07-15 4 views
1

Ich habe eine Tabelle, die Kontakte zu Unternehmen verknüpft. Wenn mehr als ein Kontakt hinzugefügt wird, gibt es eine Option zum Festlegen eines "Primären" oder "Sekundären" Kontakts. Wenn jedoch Personen einen Kontakt hinzugefügt haben, haben sie diese Funktion nicht verwendet. Das Programm wurde so geändert, dass es automatisch den ersten Kontakt markiert, der als primäres Unternehmen hinzugefügt wurde, aber die bereits eingegebenen Daten nicht repariert.SQL: Aktualisieren von Zeilen, die basierend auf einer Spalte eindeutig sind

Ich möchte die Tabelle abfragen und sagen, wenn es nur einen Datensatz pro CompanyID gibt, setzen Sie den PrimaryContact auf True, aber ich kann nicht herausfinden, wie dies zu tun ist. Für jede Firma, die mehr als einen Kontakt hat, möchte ich nichts machen. Zum Beispiel:

CompanyID ContactID PrimaryContact 
1   285   0 
2   375   0 
3   761   0 
4   1744  0 
4   2301  0 
6   335   0 
6   4987  0 
9   809   0 
9   2119  0 
10   99   0 
11   99   0 

Im obigen Beispiel CompanyID 4, 6 und 9 haben mehrere Einträge, damit ich diese nicht berühren will. Aber 1, 2, 3, 10 und 11 haben einzelne Einträge, also möchte ich für diese Zeilen PrimaryContact auf 1 setzen.

Wie kann das gemacht werden? diese

+0

Meine vorherige Abfrage falsch war, versuchen Sie diese Abfrage Update Kontakte eingestellt c1 PrimaryContact = if ((select count (1) von den Kontakten c2 wo c2.CompanyID = c1.CompanyID Gruppe von c2.CompanyID) > 1, 0, 1) –

Antwort

1

Die Syntax Sie für MS SQL Server wollen, ist:

update contacts 
set PrimaryContact = 1 
where CompanyID in (
    select CompanyID 
    from contacts 
    group by CompanyID 
    having count(distinct ContactID) = 1 
) 

Die Frage zuvor als MySQL und die ursprüngliche Antwort unten markiert wurde, wird dem angepasst.

Dies ist eine Möglichkeit, es zu tun:

update contacts as c 
inner join 
(
    select CompanyID 
    from contacts 
    group by CompanyID 
    having count(distinct ContactID) = 1 
) t on c.CompanyID= t.CompanyID 
set PrimaryContact = 1; 

In der abgeleiteten Tabelle zeigt die CompanyIDs finden, die eine einzige ContactID hat. Das Ergebnis dieser Abfrage wird dann mit der Tabelle verknüpft, die aktualisiert werden soll.

Sample SQL Fiddle

+0

Die Select-Anweisung nach dem inneren Join identifiziert die Zeilen mit einem einzigen Eintrag (1,2,3,10 und 11) korrekt, aber ich kann das Update nicht als Ganzes in MS SQL Server ausführen Management Studio (2014). Es scheint, dass es den "as c" -Teil nicht mag. Also habe ich die Abfrage gegen die Tabelle ausgeführt und dann die Ergebnisse in eine neue Tabelle namens tCompanyIDs mit nur "CompanyID" als einziges Feld kopiert. Ich habe das dann in meiner Abfrage verwendet: – Allan

+0

@Allan Sie haben die Frage mit dem Tag [tag: MySQL] markiert und die Syntax in meiner Antwort ist an diese Datenbank angepasst. Wenn Sie MS SQL Server verwenden, ändern Sie bitte das Tag in der Frage und ich werde meine Antwort aktualisieren. – jpw

+0

Auch mit Ihrem MySQL-Beispiel konnte ich es ändern, um zu arbeiten, aber danke, dass Sie die SQL Server-Version gepostet haben ... Ich bin mir sicher, dass es wieder kommen wird und ich werde mich darauf beziehen. – Allan

Verwandte Themen