Delete if abfrage

jetwork

Fleissiger Benutzer
Beiträge
97
Hallo Zusammen,

Ich habe die folgende Tabelle:
upload_2015-2-11_13-34-19.png
Hier ist meine Abfrage um die Einträge mit bestimmtem Child id zu löschen:
DELETE FROM scenario_hierarchy WHERE scenario_hierarchy.child_id = id_to_be_deleted

Ich will aber noch eine Bedingung hinzufügen. Die Einträge möchte ich löschen nur wenn es nicht mehr als einmal in Parent_id vorkommen.
Zum Beispiel man darf den Eintrag 5, 4 und 3 löschen aber 1 und 2 nicht, weil 1 und 2 mehr als einmal in der Parent_id vorkommen.

Hier ist die beschreibung meiner Abfrage:
IF
(SELECT COUNT( *) FROM `scenario_hierarchy` WHERE parent_id = id_to_be_deleted <2)
FÜHRE DIE FOLGENDE ABFRAG AUS
DELETE FROM scenario_hierarchy WHERE scenario_hierarchy.child_id = id_to_be_deleted

Wie kann ich diese Abfrage richtig schreiben?

Danke im Voraus
 
Werbung:
So sollte es gehen :)
Code:
Delete From scenario_hierarchy sh
Where  sh.child_id = id_to_be_deleted
And  (Select Count(*)
  From  scenario_hierarchy
  Where  child_id = id_to_be_deleted) > 1
 
Ich habe diese Abfrage ausgeführt und bekamm die bekannte Syntaxfehler Message:

Abfrage:
upload_2015-2-11_14-42-37.png

Fehler:
upload_2015-2-11_14-43-14.png

Ich konnte die Abfrage nicht korrigieren. Ich glaube so eine Abfrage ist nicht in MySQL zulässig oder mache ich etwas falsch?
 
Keine Sub-Selects in den Bedingungen?... MySQL happens... :)
Oder kann es den Alias einfach nicht auflösen?...
Probier mal das:
Code:
Delete From scenario_hierarchy
Where  scenario_hierarchy.child_id = id_to_be_deleted
And  (Select Count(*)
  From  scenario_hierarchy
  Where  child_id = id_to_be_deleted) > 1
 
http://dev.mysql.com/doc/refman/5.6/en/update.html
Interessant wirds hier:
"Currently, you cannot update a table and select from the same table in a subquery."

Alternativ:
Mein Sub-Select in eine eigene Tabelle einfügen. Dann via id darüber abfragen
(Oracle Syntax)
Code:
Create Table my_temp_tab
(
   id Number,
   count Number
);

Insert Into my_temp_tab
   (Select child_id,
           Count(*)
    From   scenario_hierarchy
    Where  child_id = id_to_be_deleted
    Group  By child_id
    Having Count(*) > 1);
Commit;

Delete From scenario_hierarchy
Where  scenario_hierarchy.child_id = id_to_be_deleted
And    Exists (Select 1
        From   my_temp_tab
        Where  id = id_to_be_deleted);
... Ne billige Lösung für ne billige DB? :)
 
http://dev.mysql.com/doc/refman/5.6/en/update.html
Interessant wirds hier:
"Currently, you cannot update a table and select from the same table in a subquery."

Alternativ:
Mein Sub-Select in eine eigene Tabelle einfügen. Dann via id darüber abfragen
(Oracle Syntax)
Code:
Create Table my_temp_tab
(
   id Number,
   count Number
);

Insert Into my_temp_tab
   (Select child_id,
           Count(*)
    From   scenario_hierarchy
    Where  child_id = id_to_be_deleted
    Group  By child_id
    Having Count(*) > 1);
Commit;

Delete From scenario_hierarchy
Where  scenario_hierarchy.child_id = id_to_be_deleted
And    Exists (Select 1
        From   my_temp_tab
        Where  id = id_to_be_deleted);
... Ne billige Lösung für ne billige DB? :)

Danke @Distrilec .

Das ist vielleicht die Einzige lösung. Ich will aber keine neue Tabelle erstellen. Ich kann vielleicht eine Storede Prozedure erstellen. In diese Prozedure kann ich die Tabelle "my_temp_tab" erstellen und danach löschen. Ist das überhaupt möglich? Ich konnte es leider nicht schaffen
Du hast schon alles sehr ausführlich gemacht. Kannst du alles in eine Stored Prozedure umwandeln.
Als parameter in diese Procedure möchte ich "id_to_be_deleted" eingeben.

Danke im Voraus
 
Hi,

denn mal anders :)

Code:
Alle Einträge der Tabelle

mysql> SELECT * from scenario_hierarchy;
+----+------+------+
| id | pid  | cid  |
+----+------+------+
|  2 |    2 |    2 |
|  3 |    2 |    2 |
|  4 |    4 |    3 |
|  5 |    5 |    4 |
|  6 |    6 |    5 |
|  7 |    7 |    2 |
|  8 |    9 |    6 |
|  9 |   11 |    2 |
| 10 |   11 |    2 |
| 22 |    9 |    2 |
+----+------+------+
10 rows in set (0,00 sec)

Code:
Alle Einträge, alle die in tmp.id null haben dürften gelöscht werden

mysql> SELECT sh.*,tmp.*
    -> FROM scenario_hierarchy sh
    -> LEFT  JOIN
    ->   ( SELECT tmpsh.* FROM scenario_hierarchy tmpsh ) AS tmp
    ->     ON tmp.pid = sh.pid AND sh.id <> tmp.id
    ->     ;
+----+------+------+------+------+------+
| id | pid  | cid  | id   | pid  | cid  |
+----+------+------+------+------+------+
|  2 |    2 |    2 |    3 |    2 |    2 |
|  3 |    2 |    2 |    2 |    2 |    2 |
|  4 |    4 |    3 | NULL | NULL | NULL |
|  5 |    5 |    4 | NULL | NULL | NULL |
|  6 |    6 |    5 | NULL | NULL | NULL |
|  7 |    7 |    2 | NULL | NULL | NULL |
|  8 |    9 |    6 |   22 |    9 |    2 |
|  9 |   11 |    2 |   10 |   11 |    2 |
| 10 |   11 |    2 |    9 |   11 |    2 |
| 22 |    9 |    2 |    8 |    9 |    6 |
+----+------+------+------+------+------+
10 rows in set (0,00 sec)

Code:
Und dann wird gelöscht ( Child_id = 2)

mysql> DELETE sh
    -> FROM scenario_hierarchy sh
    -> LEFT  JOIN
    ->   ( SELECT tmpsh.* FROM scenario_hierarchy tmpsh ) AS tmp
    ->     ON tmp.pid = sh.pid AND sh.id <> tmp.id
    -> WHERE sh.cid = 2 AND tmp.id IS NULL;
Query OK, 1 row affected, 1 warning (0,00 sec)

mysql>

Code:
Das wars

mysql> SELECT * FROM scenario_hierarchy ;
+----+------+------+
| id | pid  | cid  |
+----+------+------+
|  2 |    2 |    2 |
|  3 |    2 |    2 |
|  4 |    4 |    3 |
|  5 |    5 |    4 |
|  6 |    6 |    5 |
|  8 |    9 |    6 |
|  9 |   11 |    2 |
| 10 |   11 |    2 |
| 22 |    9 |    2 |
+----+------+------+
9 rows in set (0,00 sec)

mysql>


Gruss

Bernd
 
Nein, nur MySQL, aber mit Maria gehts natürlich auch.


Code:
mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.21-log |
+------------+
1 row in set (0,00 sec)

mysql>

Gruss

Bernd
 
Werbung:
Danke an euch alle.

Die Lösungen sind gut. ich habe aber immer noch nicht verstanden warum wir mit Hilfe von einem if statement diesen Problem nicht lösen können.
 
Zurück
Oben