heinetz: Hilfe bei SQL-Statement

Hallo Forum,

ich habe in meiner Datenbank mehrere Tabellen. Z.B. die
Tabelle 'products_properties':

+-----------+--------------+-----------+
|product_id |  property_id | values_id |
+===========+==============+===========+
|         1 |           13 |       245 |
+-----------+--------------+-----------+

Der 'eigentliche' Wert, den ich aus diesem Datensatz
verwende, ist durch 'values_id' auf die Tabelle 'values'
referenziert.

+------+---------------------+----------+-----------+
|   id |                 typ |   lang_0 |    lang_1 |
+======+=====================+==========+===========+
|  245 | products_properties |    klein |     small |
+------+---------------------+----------+-----------+

Das funktioniert alles sehr gut. Was allerdings passieren
kann, ist dass ein verwaister Datensatz in der Tabelle
'values' verbleibt. Um bei diesem Beispiel zu bleiben:

Der Datensatz mit der Referenz auf die 'values_id' ist
durch irgendeinen Umstand nicht mehr vorhanden.

Um das ganze bereinigen zu können, komme ich mit folgendem
SQL-Statement an die verwaisten Datensätze:

  
SELECT *  
FROM `values`  
LEFT JOIN `products_properties` ON `values`.`id` = `products_properties`.`values_id`  
WHERE `values`.`typ` = 'products_properties'  
AND isnull( `products_properties`.`values_id` )  

Jetzt besteht meine DB natürlich nicht nur aus zwei Tabellen,
sondern aus mehreren. Die Datensätze aus anderen Tabellen
referenzieren genauso über die 'values_id' auf die Tabelle
'values'.

'products_properties'
+-----------+--------------+-----------+
|product_id |  property_id | values_id |
+===========+==============+===========+
|         1 |           13 |       245 |
+-----------+--------------+-----------+

'languages'
+-----------+------------+
|        id |  values_id |
+===========+============+
|         1 |         13 |
+-----------+------------+

'values'
+------+---------------------+----------+-----------+
|   id |                 typ |   lang_0 |    lang_1 |
+======+=====================+==========+===========+
|  245 | products_properties |    klein |     small |
+------+---------------------+----------+-----------+
|   13 |           languages |  deutsch |    german |
+------+---------------------+----------+-----------+

Angenommen die beiden Datensätze in dem Beispiel seien
verwaist, sprich es gibt keine Zuordnung mehr in den
entsprechenden Tabellen, auf die auch das Feld 'typ'
Aufschluss gibt, krieg ich beide verwaisten Datensätze
mit einem SQL-Statement heraus ?

danke für Tipps und

beste gruesse,
heinetz

  1. ok, war garnicht so schwer ;)

      
    SELECT *  
    FROM `values`  
    LEFT JOIN `properties` ON `values`.`id` = `properties`.`values_id`  
    LEFT JOIN `products_properties` ON `values`.`id` = `products_properties`.`values_id`  
    WHERE (  
    `values`.`typ` = 'products_properties'  
    AND isnull( `products_properties`.`values_id` )  
    )  
    OR (  
    `values`.`typ` = 'properties'  
    AND isnull( `properties`.`values_id` )  
    )  
    
    

    ... so geht's. Allerdings sind es 5 oder 6 Tabellen,
    die ich in dem SQL-Statament berücksichtigen müsste
    und ich frage mich, ob das eventuell eleganter geht.

    beste gruesse,
    heinetz

    1. moin,

      ich weiß nicht genau, was du machst (auch bezogen auf deinen anderen beitrag), ob du bei eine testdatenbank ein wenig ausprobierst oder aber ob wir hier von einem system reden, das in den produktiven einsatz gehen sollte. bei letzterem sehe ich einige stellen, die man vielleicht noch mal hinterfragen sollte.

      Ilja