Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

MSSQL Selektieren einer bestimmten Zeile

Mitglied: dunvegane

dunvegane (Level 1) - Jetzt verbinden

31.08.2011, aktualisiert 15:35 Uhr, 8098 Aufrufe, 11 Kommentare

Ich möchte Daten in einer Datenbanktabelle mit Daten aus einer anderen Personen-Tabelle updaten.

Problem ist, dass ich bestimmte Zeilen selektieren muss.

Situation:

Tabelle-B
ID
NAME1
NAME2
NAME3


Tabelle-A
ID
B_ID
NAME
VORNAME


Tabelle B soll mit den Personendaten (Name, Vorname) aus Tabelle A befüllt werden. Über eine ID ist eine Zuordnung der Datensätze möglich.

Allen Datensätze haben 1 bis maximal 3 Personen.

1. Person soll in Feld NAME1 (Tabelle-B)
2. Person soll in Feld NAME2 (Tabelle-B)
3. Person soll in Feld NAME3 (Tabelle-B)


Die 1. Person konnte ich bereits mit TOP (1) herausfiltern und zuordnen:

UPDATE Tabelle-B

SET [Name1] = (
Select TOP (1) NAME + ', ' + VORNAME
FROM Tabelle-A
WHERE Tabelle-B.ID= Tabelle-A.B_ID
ORDER BY Tabelle-A.NAME
)


Wie kann ich die 2. und 3. Person filtern ? (würde der 2. Zeile des Select entsprechen, bzw. der 3. Zeile)
Mitglied: HStumpf
31.08.2011 um 17:50 Uhr
Hallo

welche Datenbank wird denn eingesetzt?

Bei MSSQL 2008 R2 im TSQL über den Umweg einer Table Variablen

Horst
Bitte warten ..
Mitglied: dunvegane
01.09.2011 um 08:19 Uhr
Wir nutzen MS SQL 2005 Standard Edition.
Bitte warten ..
Mitglied: dunvegane
02.09.2011 um 07:14 Uhr
Ich hatte gehofft dass es eine Möglichkeit gibt eine bestimmte Zeile auszulesen. Dürfte doch eine sehr häufige Anwendung sein.
Bitte warten ..
Mitglied: Biber
02.09.2011 um 09:59 Uhr
Moin dunvegane,

Zitat von dunvegane:
Ich hatte gehofft dass es eine Möglichkeit gibt eine bestimmte Zeile auszulesen.
Dürfte doch eine sehr häufige Anwendung sein.
Ja, schon.
Selbst MSSQL bietet dafür die Möglichkeiten mit Konstrukten über ROW_NUMBER() oder auch ROW_NUMBER() OVER(ORDER BY id).

Die eigentliche Schwierigkeit in deiner verquasten Situation ist eine andere.

In deinem TOP(1) UPDATE-Statement-Beispiel bist du fein raus. Jeder Satz, der überhaupt mit diesem UPDATE-Statement angefasst wird, bekommt auch einen Wert in das Feld NAME1. Nix kann schiefgehen.

Beim Ermitteln der UPDATE-Werte für NAME2 und NAME3 mit der Strategie "Schreib da den zweiten (bzw. dritten) gefundenen Datensatz rein" geht es in die Grütze, wenn es keinen zweiten oder dritten Datensatz gibt.


Somit wäre vorab zu klären:
  • Gibt es denn für alle upzudatenden Sätze auch (mindestens) 3 Sätze in der TabelleA?
  • oder sollen nur alle Sätze upgedatet werden, für die es genau 3 Sätze in TabelleA gibt?
  • oder sind die Datenfelder NAME2 und NAME3 wirklich NULLABLE/optional - dann wären unter Umständen 3 Update-Statements sinnvoller. Eines für den Fall, dass nur ein Datensatz in TabelleA vorliegt, ein Statement für den Fall "zwei Datensaätze" und eines für den Fall "mindestens drei Datensätze".

Zusatzverständnis-Fragen:
  • wenn mehr als 3 Datensätze in TabelleA vorliegen, dann landen "nur" die alphabetisch sortierten ersten drei als NAME1, NAME2, NAME3 im Ziel?? Ist dir bewusst und so gewollt?
  • das bisherige TabelleA-Feld "ID" wird stillschweigen weggeworfen - wird nie wieder gebraucht? keine Constraints oder Child-Datensätze, die davon abhängen?

Grüße
Biber
Bitte warten ..
Mitglied: pi314
12.09.2011 um 15:31 Uhr
Das ganze sollte mit einer Schleife funktionieren.
Erst werden die Grunddaten mit den zu updatenden Daten gejoint und dann wird die Tabelle upgedatet.
Durch eine Nummerierung innerhalb der Gruppe (B_ID) wird dann bestimmt, welche Spalte upgedatet wird. Das ganze kann man auch mit dynamischen SQL machen, dann spart man sich die Wiederholung der Update-Statements.

Mangels MS-SQL mal die Oracle-Syntax dazu. Sicherlich kann das MS-SQL auch.. eventuell kann das ja einer "übersetzen"
Dabei ist es auch egal, ob es immer drei Namen gibt oder nicht.. nur mehr wären bei diesem Beispiel schlecht, aber selbst das bekommt man bei Bedarf noch in den Griff.

01.
begin 
02.
   for rec in (select b.id as theUpdateID, a.name, a.vorname, count(*) over( partition by a.b_id order by b.id Rows Unbounded Preceding ) as rn 
03.
                 from test_b b 
04.
                      join test_a a on (a.b_id = b.id) 
05.
                order by b.id) loop 
06.
         if rec.rn = 1 then 
07.
            update test_b set name1 = rec.vorname || ' ' || rec.name where id = rec.theUpdateID; 
08.
         end if; 
09.
         if rec.rn = 2 then 
10.
            update test_b set name2 = rec.vorname || ' ' || rec.name where id = rec.theUpdateID; 
11.
         end if; 
12.
         if rec.rn = 3 then 
13.
            update test_b set name3 = rec.vorname || ' ' || rec.name where id = rec.theUpdateID; 
14.
         end if; 
15.
   end loop; 
16.
end; 
17.
/
so long,
pi
Bitte warten ..
Mitglied: dunvegane
12.09.2011 um 20:04 Uhr
klingt auf jeden Fall eine Überlegung wert. Werde ich nächste Woche mal testen.
Bitte warten ..
Mitglied: pi314
14.09.2011 um 13:26 Uhr
Als "Weiterbildungsmaßnahme" hab' ich mir das mal in TSQL geschrieben.. und es geht

01.
declare updCursor Cursor for 
02.
	select b.id as theUpdateID 
03.
		 , a.name, a.vorname 
04.
		 , ROW_NUMBER() over( partition by a.b_id order by a.id) as rn 
05.
	  from tab_b b 
06.
			left join tab_a a on (a.b_id = b.id) 
07.
		 order by a.b_id; 
08.
declare @updID VarChar( 30 ); 
09.
declare @name VarChar( 30 ); 
10.
declare @vorname VarChar( 30 ); 
11.
declare @rn VarChar( 3 ); 
12.
open updCursor; 
13.
fetch next from updCursor into @updID, @name, @vorname, @rn; 
14.
while @@FETCH_STATUS = 0 
15.
	begin 
16.
		declare @stmt NVarChar( max ); 
17.
		set @stmt = 'update tab_b set name' + @rn + ' = ''' + @vorname + ' ' + @name + ''' where id = ' + @updID; 
18.
		print @stmt; 
19.
		exec sp_executesql @stmt; 
20.
		 
21.
		fetch next from updCursor into @updID, @name, @vorname, @rn; 
22.
	end; 
23.
close updCursor; 
24.
deallocate updCursor;
Bitte warten ..
Mitglied: Biber
14.09.2011 um 19:22 Uhr
Moin pi314,

nur als Anmerkung....
Schöne Arbeit. und auch keine Zweifel, dass es geht.

Allerdings - die Deklaration (und auch Verwendung) von @updID und @rn als varChar()-Typen finde ich schon etwas brutal.

Denn eigentlich werden die beide nicht in der Zeile 01 bzw. 21 als String, sondern als numerische Werte angefordert/duchgefetched.

In diesem Paar-Zeilen-Statement mag man/frau das ja noch im Auge und/oder im Hinterkopf behalten können.

In einem "längeren" und "produktiven" Schnipsel ist eine solche (kommentarlose) Aktion möglicherweise ein Anlass zu langwieriger Fehlersuche.

Eine so genannte "Sollbruchstelle" eben

Grüße
Biber
Bitte warten ..
Mitglied: pi314
14.09.2011 um 20:37 Uhr
Ja Biber, da gebe ich dir recht
Sie sollten als Number deklariert sein und dann gecastet werden.

Hatte ich auch erst anders geschrieben, dann aus irgendwelchen Fehlergründen umgewandelt (irgendwas hat nicht geklappt und dann hab ich etwas rumprobiert..)

Das bringt mich zu einer Frage:

Kann man in T-SQL auch Variablen anhand von Spaltendefinitionen deklarieren?
So wie bei PL/SQL:
01.
updID   TEST_A.id%type;
Bitte warten ..
Mitglied: Biber
14.09.2011 um 21:40 Uhr
Moin pi314,

Zu deiner Frage, ob es etwas dem oraclehaften xy.Feldname%type vergleichbares in T-SQL gäbe...

Ja nee... nicht wirklich... von Praktikanten für Praktikanten...

Die Redmonder Realitätsferne zeigt sich selten so schön wie hier.
Es gibt (wie immer im Leben) natürlich einen Weg, der über die sp_describe_cursor_columns führt.

Angelehnt ist der Name sp_describe_cursor_columns natürlich an das fett gedruckte.
Und in diesen Metadaten kommen auch die folgenden Attribute vor.
column_size [int] =Die maximal mögliche Größe von Werten in dieser Spalte.
data_type_sql [smallint] Eine Nummer zum Anzeigen des SQL Server-Datentyps der Spalte.
[Ist zitert aus der o.g. TechNet-Site]

Dieses kryptische ###-data_type_sql wiederum, wortwörtlich "eine Nummer zum Anzeigen des ..Datentyps"...
--> den kann dann jeder interpretieren, der schon mit Excel 95 und Access/ADO-Krempel aufgewachsen ist.

Also --> ist aus meiner Sicht eher eine Frechheit als eine Unterstützung.

Ich habe zwar nichts gegen ein büschen Rumskripten, aber alle Räder immer wieder neu erfinden müssen... muss ich auch nicht haben.

Und ich arbeite ungern mit Tools, die mit so viel Realitätsferne und Alltagsuntauglichkeit zusammengekehrt wurden.

Grüße
Biber
Bitte warten ..
Mitglied: pi314
15.09.2011 um 15:22 Uhr
Mahlzeit Biber,

Ja nee... nicht wirklich... von Praktikanten für Praktikanten...

Die Redmonder Realitätsferne zeigt sich selten so schön wie hier.

*klatsch*
Bitte warten ..
Ähnliche Inhalte
Datenbanken

MSSQL Datenkonvertierung 1 Zeile auf mehrere Zeilen - bitte um Tips

gelöst Frage von highmoeDatenbanken4 Kommentare

Hallo zusammen, ich bräuchte mal Hilfe bei einer Datenübernahme in ein neues Format. Aus historischen Gründen gibt es eine ...

Batch & Shell

Batch Zeile für Zeile auslesen und jede Zeile eine bestimmte Variable zuweisen

gelöst Frage von CerauxBatch & Shell4 Kommentare

Hallo, ich habe schon überall gesucht und noch nichts gefunden wie man Zeilen bestimme Variablen zuweist. Zum Beispiel: file.txt: ...

Batch & Shell

Sed - Zeile mit bestimmten Anfang löschen

gelöst Frage von PathoeBatch & Shell2 Kommentare

Hallo zusammen, ich habe schon mal ein wenig mit sed "herumgespielt" aber noch nicht wirklich zu dem Ergebnis gekommen, ...

Batch & Shell

Wie ändert eine batch eine bestimmte zeile in einer anderen batch

Frage von J4YK0BBatch & Shell3 Kommentare

Wie schreibt eine batch eine andere batch um, aber nur eine SPEZIELLE zeile? Das System ist wiefolgt. Man gibt ...

Neue Wissensbeiträge
Sicherheit

Interessante Methode für Leute, die in einer Windowsdomäne starke Kennwörter erzwingen wollen

Information von DerWoWusste vor 14 MinutenSicherheit1 Kommentar

Dieser Artikel beschreibt, wie man auch ohne 3rd-party-tools die Kennwortsicherheit in Windows-Domänen erhöhen kann. Der Grundgedanke lautet: wir prüfen ...

Windows Server

SBS 2011: Installation von KB4457144 schlägt beim Reboot fehl - Von Dienst gesperrte Schriftart ursächlich

Tipp von the-buccaneer vor 11 StundenWindows Server1 Kommentar

Moinsen zusammen! Das hat mich einige graue Haare gekostet: Ein SBS 2011 weigerte sich schon im August, das monatl. ...

Windows Netzwerk
Browser-Lags und IPv6
Erfahrungsbericht von NixVerstehen vor 17 StundenWindows Netzwerk1 Kommentar

Hallo zusammen, wir betreiben als kleines Speditionsunternehmen ein überschaubares Windows-Netzwerk mit Win10-Clients sowie einem Server 2016 Essentials als "eierlegende ...

Humor (lol)

Erstaunlich, Windows mit extremer Laufzeit (Server) lol

Tipp von mathu vor 19 StundenHumor (lol)5 Kommentare

Was es so alles gibt. :-)

Heiß diskutierte Inhalte
Hyper-V
Windows Serer 2016 Standard virtualisieren
gelöst Frage von fritte87Hyper-V33 Kommentare

Hallo zusammen, ich muss für eine kleine Firma ein entsprechendes neues kleines Konzept bauen. Ich habe einen Server Standard ...

LAN, WAN, Wireless
Kombiniere mehrere 4G Router zu einem Netzwerk - Anwendung kleine LAN (10-20 Leute)
Frage von HulkTheHeroLAN, WAN, Wireless24 Kommentare

Guten Mittag liebes Administrator - Fourm, ich hoffe ich habe das richtige Thema ausgewählt - ansonsten bitte gerne verschieben ...

Windows Server
Fileserver von 2012 R2 auf 2012R2
gelöst Frage von ThabeusWindows Server23 Kommentare

Moin moin, leider war in der Vergangenheit der Fokus des Betriebs nicht auf Langfristigkeit ausgelegt. Daher stehe ich jetzt ...

Router & Routing
Größere Zahl VPN-Verbindungen mit Fritz-Box einrichten
Frage von miscmikeRouter & Routing15 Kommentare

Hallo Zusammen, ich supporte verschiedene Kunden mit bestehenden LAN-LAN-Kopplungen via FritzBox (7490, FritzOS 7.01) . Anwendungen sind z.B. Kaspersky-KSC ...