2012-04-03 10 views
0

Ich habe eine Tabelle, wo die meisten Spalten mit Daten gefüllt sind. In dieser Tabelle habe ich Zeilen, wo ich für 4 Spalten doppelte Daten habe. Ich möchte so etwas tun:SQL Server: komplexe Operation eindeutigen Code für Gruppen von Zeilen

Überprüfen Sie alle Zeilen, gruppieren Sie alle Daten nach diesen vier Spalten (eine Gruppe = eine eindeutige Daten für diese 4 Spalten) und signieren Sie sie in der letzten Spalte UniqueCode. UniqueCode sind für die Gruppe.

Also, wenn ich so etwas wie diese:

Name Street HouseNumber PostCode UniqueCode 
Cos Cos Cos   Cos 
Cos Cos Cos   Cos 

Ich mag UniqueCode mit dem gleichen Code füllen. Ich möchte eine Abfrage schreiben, die alle aktuellen uniqueCode löscht und mit neuen füllt und schreibe trigger (ich nenne es richtig?), Die das gleiche für neu hinzugefügte Zeilen tun.

Es ist möglich, dieses Verhalten in SQL schreiben?

Oder muss ich es in Code in meinem Programm tun?

Können Sie mir helfen?

Sorry für mein schlechtes Englisch.

+1

Welche Version von Sql Server ist das? –

Antwort

0

Angenommen, Sie haben eine Tabelle, ähnlich wie diese:

create table Persons 
(
    ID int identity primary key, 
    Name varchar(100), 
    Street varchar(100), 
    HouseNumber int, 
    PostCode varchar(100), 
    UniqueCode uniqueidentifier 
) 

Sie einen Trigger erstellen würde, die bereits findet eingegebenen Personen den gleichen Verbundschlüssel aufweist:

create trigger AssignPersonGroup on Persons 
after insert, update 
as 
    set nocount on 

    update Persons 
    set UniqueCode = 
    isnull(
     (select top 1 UniqueCode from Persons 
     where UniqueCode is not null 
     and Inserted.Name = Persons.Name 
     and Inserted.Street = Persons.Street 
     and Inserted.HouseNumber = Persons.HouseNumber 
     and Inserted.PostCode = Persons.PostCode) 
     , newid()) 
    from Inserted inner join Persons 
     on Inserted.ID = Persons.ID 

Und davon aus, das das wäre Daten:

insert into persons (Name, Street, HouseNumber, PostCode) 
values ('Zagor', 'Darkwood', 23, '01010') 
insert into persons (Name, Street, HouseNumber, PostCode) 
values ('Zagor', 'Darkwood', 23, '01010') 
insert into persons (Name, Street, HouseNumber, PostCode) 
values ('Chico', 'Darkwood', 23, '01010') 

Dann

select * 
from Persons 

Würde liefern:

ID Name Street HouseNumber PostCode UniqueCode 
1 Zagor Darkwood   23 01010 A113D12D-F730-42DD-B3EE-AC33E34C0679 
2 Zagor Darkwood   23 01010 A113D12D-F730-42DD-B3EE-AC33E34C0679 
3 Chico Darkwood   23 01010 FD0739AF-525C-42C2-B929-0AB8EEAC3A73 

Ihre bestehenden Daten aktualisiert werden würde, wenn Sie folgenden zwei Updates ausführen:

update persons 
    set uniquecode = newid() 

update Persons 
    set uniqueCode= 
    (
     select top 1 uniqueCode 
     from Persons groups 
     where UniqueCode is not null 
     and groups.Name = Persons.Name 
     and groups.Street = Persons.Street 
     and groups.HouseNumber = Persons.HouseNumber 
     and groups.PostCode = Persons.PostCode 
     order by ID 
    ) 

sie getrennt werden, da SQL Server verbindet ausgeführt, bevor skalare Ausdrücke. Mein erstes Ergebnis war eine Aktualisierungsabfrage mit einer abgeleiteten Tabellengruppierung für alle Spalten und Hinzufügen einer newid() - Spalte, aber als innerer Join der Personentabelle ausgeführt wurde, wurden die ersten ids für jede Zeile erneut eindeutig.

Deaktivieren Sie den Trigger, bevor Sie dies tun, und aktivieren Sie ihn später erneut. uniqueCode sollte nicht im Programm gesetzt werden, nur im Trigger. Sie benötigen einen zusammengesetzten Index für (Name, Straße, Hausnummer, Postcode) und einen weiteren für UniqueCode.

Abgesehen davon habe ich Ihre andere Frage zu diesem Projekt gesehen. Was versuchst du zu machen? Ich bin mir nicht sicher über die Art der Beziehung zwischen Primar- und Highschool-Tischen. Wenn Sie sie mit einer bestimmten Person verbinden möchten, sollten Sie eine Personentabelle mit einem Identitätsprimärschlüssel haben. Beide Tabellen würden auf dieses verweisen, und Sie würden keine Probleme haben, jemandes akademischen Weg zu identifizieren :-)

+0

Hallo, Danke für die Antwort. Das habe ich gerade gebraucht.Aber deine Frage nach der Beziehung zwischen Grundschule und High School zwingt mich zum Nachdenken. Ich versuche, alle Schulen, die sich im selben Gebäude befinden, mit einem eindeutigen Code zu verknüpfen. Problem ist, dass ich eine Tabelle mit Spalten wie oben erwähnt habe und eine andere wichtige Spalte. In meinem Programm brauche ich eine Liste dieser Schulen, und wenn ich eine von ihnen wähle, brauche ich Liste von verwandten Schulen. Alle verwandten Schulen benötigen einen eindeutigen Code (für die gesamte Gruppe). Ich weiß, dass die beste Methode durch separate Tabelle (Adresse oder so ähnlich) ist, aber ich kann nicht konvertieren. –

+0

Eine andere Frage. Ich will nicht so lange Guid. Ich brauche einen Code mit 5 bis 6 Buchstaben. Wie kann ich das erreichen? –

+0

@JakubDropia Ich glaube, dass es dasselbe sein sollte. Um Daten zu testen, geben Sie folgende Abfrage aus: 'Wählen Sie Name, Straße, Hausnummer, PostCode aus der MyTable-Gruppe nach Name, Straße, Hausnummer, PostCode mit Anzahl (eindeutiger eindeutiger Code)> 1 '. Die zurückgegebenen Datensätze zeigen Adressen mit mehr als 1 Code. Wie für den Funktionscode können Sie int verwenden, müssen aber die nächste Nummer aus einer dedizierten Zählertabelle zuweisen. Und Sie haben Recht - Adressentabelle ist die beste Lösung. Ich habe nicht genug Platz im Kommentar, um Ihnen zu zeigen, wie und wenn Sie es tun wollen, lassen Sie mich eine Zeile fallen. –

Verwandte Themen