kratos
Goto Top

SQL 2 Tabellen miteinander vergleichen und nicht benutzte Werte anzeigen lassen

Hallo zusammen,

ich würde gerne über Powershell Script, aus 2 SQL Tabellen werte vergleichen und die anzeigen lassen, die nicht benutzt werden.

Beispiel.

E-Mail Regel erste Tabelle wo alles angezeigt wird:

id:

1
2
3
4
5
6
7
8
9
10

E-Mail Regel 2 Tabelle wo nur benutze Regeln angezeigt werden:

regel_id:

1
4
6
9
10

Ergebnis soll sein, wo nur die nicht benutzten angezeigt werden.

2
3
5
7
8

Ich hoffe, das ist verständlich, was ich meine, weil ich es irgendwie nicht hinbekomme.

Wäre für eure Lösungsansätze dankbar.

Bin leider noch ein Anfänger in PowerShell Scripten.

Vielen Dank euch zusammen schonmal vorab.

LG

Kratos

Content-ID: 6151335970

Url: https://administrator.de/contentid/6151335970

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

Crusher79
Crusher79 27.02.2023 aktualisiert um 15:49:39 Uhr
Goto Top
SELECT id
FROM table1
WHERE Number NOT IN (SELECT id FROM table2)

PowerShell oder SQL? Du kannst die Query wie oben ja da reindrücken und bekommst als Objekt das Ergebnis zurück.

Oder 2x Queries die 2x PowerShell Objekte füllen, die man dann vergleicht. Eig. reicht das oben bei SQL vollkommen und wir überlassen das Denken dem Pferd.

Nun zeig aber erstmal deine SQL Query in PS ....
Kratos
Kratos 27.02.2023 um 15:59:29 Uhr
Goto Top
hi Crusher79,

das habe ich schon ausprobiert hat nicht geklappt.

hier select 1(hier werden regeln angezeigt welche benutzt werden und wie oft):

"SELECT er.id, er.rule_key, er.rule_match, er.match_value, ma.mapped_recipient, ma.egvp_rule_id,Count(*)zeahler FROM egvp_rule er INNER JOIN maillog ma ON er.id = ma.egvp_rule_id group by egvp_rule_id"

hier select 2 hier einfach alle regeln:

"SELECT id, rule_key, rule_match, match_value From egvp_rule;"

ich will das nur die nicht benutzten angezeigt werden am besten über if, Foreach oder so.

reicht das für Verständnis?
Crusher79
Crusher79 27.02.2023 aktualisiert um 16:10:43 Uhr
Goto Top
Es gibt versch JOIN Typen.

Was hat bei verschachtelten SELECT nicht geklappt? In dem Fall heisst es, es darf keine id dann vorhanden sein. Unbenutzte IDs die so aussehen - ID 5 = "LEER", ID 6 = "LEER" geht nicht, da die ja vorhanden sind. Es würden dann alles oder nichts raus kommen - IN / NOT IN.

Wenn die 1 Tabelle da Lücken hat, sollte es gehen. Kommt nur nichts raus oder gibt es eine Fehlermeldung?

PS: Vergiss erstmal PowerShell. Geh an SQL mit z.B. MS SQL Management Konsole oder eine vergleichbare - je nach DB Hersteller - heran. Teste die Query in SQL. Stimmen die Werte holst Du sie dir via PS raus.
Kratos
Kratos 27.02.2023 um 16:14:25 Uhr
Goto Top
Das habe ich mir logischerweise uch gedacht das es funktionieren müsste hmmm.

Es wurde eine Fehlermeldung angezeigt. Nachdem ich NOT IN eingesetzt habe.

Vielleicht habe ich das falsch eingesetzt oder kann es sein das es mit join oder group by Probleme hat ?
Kratos
Kratos 27.02.2023 um 16:34:58 Uhr
Goto Top
Stimmt daran habe ich noch nicht gedacht.

Vielen Dank für den Tipp, melde mich später ob es geklappt hat.

Vg

Kratos
ukulele-7
Lösung ukulele-7 27.02.2023 aktualisiert um 16:52:13 Uhr
Goto Top
Zitat von @Kratos:

hier select 1(hier werden regeln angezeigt welche benutzt werden und wie oft):

"SELECT er.id, er.rule_key, er.rule_match, er.match_value, ma.mapped_recipient, ma.egvp_rule_id,Count(*)zeahler FROM egvp_rule er INNER JOIN maillog ma ON er.id = ma.egvp_rule_id group by egvp_rule_id"
Der Select ist syntaktisch falsch und sollte von jeder aktuellen Datenbank mit einem Fehler quittiert werden. Das könnte der Grund sein warum das "nicht geklappt" hat. Wobei es schon ein großer Unterschied ist ob eine Abfrage einen Fehler wirft oder nicht die erwarteten Daten raus kommen.

Du musst übrigens bei einem GROUP BY im SELECT-Teil immer aggregieren oder gruppieren, daher der offensichtliche Syntax-Fehler. Gruppieren ist vermutlich auch völlig überflüssig an der Stelle.

hier select 2 hier einfach alle regeln:

"SELECT id, rule_key, rule_match, match_value From egvp_rule;"
Ok.
ich will das nur die nicht benutzten angezeigt werden am besten über if, Foreach oder so.
Das über Powershell zu machen ist völliger Quatsch. Die Informationen sind alle direkt in einer SQL DB und SQL ist genau für solche Abfragen gemacht.
reicht das für Verständnis?
Wenn ich jetzt mal in meine Glaskugel schaue dann suchst du vermutlich das hier
SELECT	er.id,
		er.rule_key,
		er.rule_match,
		er.match_value
FROM	egvp_rule er
LEFT JOIN maillog ma
ON		er.id = ma.egvp_rule_id
WHERE	ma.egvp_rule_id IS NULL
Alle Einträge aus egvp_rule zu denen sich in maillog keine Einträge joinen lassen. Nennt sich Left Join Exclusive oder Left Join if NULL oder A-B je nachdem auf welche Grafik man grade schaut.

Geht natürlich auch anders, z.B. mit NOT IN. Aber Joins sind eigentlich immer besser als Subquerys.
em-pie
em-pie 27.02.2023 um 17:25:37 Uhr
Goto Top
Moin,

Zitat von @Kratos:
Es wurde eine Fehlermeldung angezeigt. Nachdem ich NOT IN eingesetzt habe.
Fehlermeldungen sollten gelesen und verstanden werden face-wink
Vielleicht habe ich das falsch eingesetzt oder kann es sein das es mit join oder group by Probleme hat ?

Wenn ich mir dein Script oben anschaue, weiß ich genau, was dein Problem war.
Where id not in (SELECT ... FROM ...): In dem Subselect, innerhalb des NOT IN darfst du nur eine Spalte - die ID - angeben:

Das geht:
SELECT id, col1, col2, col3 
FROM myTable 
WHERE id NOT IN (SELECT id from otherTable)

Das wiederum geht nicht:
SELECT id, col1, col2, col3 
FROM myTable 
WHERE id NOT IN (SELECT id, Field1 from otherTable)


Wenn du mit JOINS arbeiten willst:
SELECT mytable.id, mytable.col1, mytable.col2, mytable.col3, otherTable.Field1
FROM myTable 
FULL OUTER JOIN otherTable on myTable.id = otherTable.id
WHERE myTable.id IS NULL OR otherTable.id IS NULL

https://commons.wikimedia.org/wiki/File:SQL_Joins.svg
mbehrens
mbehrens 27.02.2023 um 21:37:58 Uhr
Goto Top
Ein möglicher Ansatz:

select id from table1 minus select id from table2;
Kratos
Kratos 28.02.2023 um 12:06:26 Uhr
Goto Top
Hi, @ukulele-7, deine Glaskugel aussage, hat geholfen face-wink habe dank dir eine Lösung gefunden, die ich erfolgreich mit PowerShell Script verbinden konnte.

Vielen Dank @ukulele-7


VG,

Kratos