Thread SQLite - IDs aus zwei Tabellen anhand von anderen Spaltenwerte in dritte Tabelle eintragen (9 answers)
Opened by Linuxer at 2017-05-18 19:30

Linuxer
 2017-05-18 19:30
#186544 #186544
User since
2006-01-27
3590 articles
HausmeisterIn

user image
Hallo,

sorry für den Titel, wusste es gerade nicht besser zu formulieren.

Sagen wir mal, ich habe drei Tabellen (hier vereinfacht):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE Addresses (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL
);

CREATE TABLE Groups (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL
);

CREATE TABLE Group_Members (
grp_id INTEGER REFERENCES Groups(id),
adr_id INTEGER REFERENCES Addresses(id)
);


"Addresses" soll Rechner-Namen oder IP-Adressen enthalten.
Manche der angelegten Adressen können in Gruppen zusammengefasst sein; "Groups" enthält die Namen der Gruppen.
"Group_Members" soll dann die Zuordnung zwischen Gruppe und Adressen enthalten.

Nehmen wir an, ich habe nun einen (bereits registrierten) Gruppen-Namen und ebenso eine entsprechende Adresse.
Wie muss ich den INSERT-Befehl zusammenstellen, damit ich anhand des Namens und der Addresse die jeweiligen IDs in die dritte Tabelle "Group_Members" eintragen kann?

Ich werkel schon eine Weile an dem ganzen (SQL) rum (noch wegen anderer Dinge) und momentan raucht der Kopf zu viel...

...

Wie ich das hier so geschrieben habe, hatte ich eine "doofe Idee" und diese ausprobiert. Funktioniert (jedenfalls mit dem Test-SQL-Code) (wenn man die Daten korrekt aufbereitet, kommt auch ein besseres Ergebnis im produktiven Code raus)...

Aber geht das auch kürzer und "schöner" oder ist das die Art wie man das üblicherweise so macht (also mehrere SELECTs für die gesuchten Werte aus den verschiedenen Quell-Tabellen)? Hier mal mein auf dieses "Problem" reduzierte SQLite Test-Code:

reduced.sql (2.0kb):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CREATE TABLE IF NOT EXISTS Addresses (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
address TEXT NOT NULL,
description TEXT DEFAULT ""
);

CREATE TABLE IF NOT EXISTS Address_Groups (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
description TEXT DEFAULT ""
);

CREATE TABLE IF NOT EXISTS Addr_Groups_Members (
grp_id INTEGER REFERENCES Address_Groups(id),
obj_id INTEGER REFERENCES Addresses(id)
);

-- insert some addresses and groups
INSERT INTO Addresses (name,address) VALUES ("any","any");
INSERT INTO Addresses (name,address) VALUES ("localhost", "127.0.0.1");
INSERT INTO Address_Groups(name) VALUES ("dummy");

-- register a group membership
INSERT INTO Addr_Groups_Members VALUES (( SELECT id FROM Address_Groups WHERE Address_Groups.name = "dummy"), (SELECT id FROM Addresses WHERE Addresses.name = "any" ));
INSERT INTO Addr_Groups_Members VALUES (( SELECT id FROM Address_Groups WHERE Address_Groups.name = "dummy"), (SELECT id FROM Addresses WHERE Addresses.name = "localhost" ));


-- check resulting tables
SELECT "Addresses", * FROM Addresses;
SELECT "Address Groups",* FROM Address_Groups;
SELECT "Group Members",* FROM Addr_Groups_Members;


Testlauf mit sqlite3 test.db < reduced.sql

Also, lassen sich die INSERT-Statements in Zeile 25+26 vereinfachen oder ist das so gut und OK?
Last edited: 2017-05-18 19:41:33 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread SQLite - IDs aus zwei Tabellen anhand von anderen Spaltenwerte in dritte Tabelle eintragen