Announcement

Collapse
No announcement yet.

(E)ER-Model2SQL und NestedQuery Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • (E)ER-Model2SQL und NestedQuery Problem

    Hallo zusammen

    Wahrscheinlich sind meine Fragen trivial, aber ich konnte bis jetzt noch nichts ausführliches dazu finden.

    Frage1:
    Gegeben ist unten stehende verschachtelte Query. Nun verstehe ich dabei nicht, was die verschachtelte Query genau macht, im speziellen der innere Teil. Vielleicht liegt's auch nur daran, dass ich nicht verstehe was SELECT NULL genau soll. Ich habe mal versucht ein SELECT NULL FROM X auf meiner Test-DB laufen zu lassen, mit dem Ergebnis, dass eine Spalte NULL-Values ausgegeben wird. Wenn ich nun aber eine WHERE Bedingung einbaue, dann kommt eine Meldung, dass das Attribut x nicht vorhanden ist. Kann mir einer kurz erklären wie, wann und wieso SELECT NULL Sinn macht (das Attribut x ist in meiner Tabelle natürlich vorhanden)?

    Code:
    SELECT *
    FROM   A
    WHERE NOT EXISTS ( SELECT NULL
                       FROM   R
                       WHERE R.x = A.x AND R.a != A.a );
    Frage 2:
    In (E)ER-Modellen gibt es ja is-a und has-a Beziehungen. Nun ist mir die modellbasierte Idee schon klar, nur konnte ich noch kein wirkliches Beispiel dieser beiden Beziehungen in SQL finden.

    Z.B. ist ein Modell mit Manager is-a Angestellter und Sekretärin is-a Angestellter gegeben. Angestellter hat das Attribut Name, Manager zusätzlich das Attribut Stufe und Sekretärin das Attribut AnschlägeProMinute.
    Kann mir jemand sagen, wie ich diese Beziehungen nun in SQL implementiere?

    Ein Ähnliches Beispiel wäre auch für die has-a Beziehung sehr hilfreich. Z.B. Fahrrad has-a Reifen und has-a Lenker (to SQL).


    Vielleicht habe ich auch nur einen Blackout und es ist wirklich so trivial wie ich eigentlich befürchte... falls ihr einen Link kennt mit solchen Beispielen wäre das super!


    Besten Dank schon mal für eure Hilfe

    Gruss

    Thomas

  • #2
    1).Es werden nur die Datensätze von A angezeigt, für welche es keine Eintrag in R gibt in dem eine bestimmte Eigenschaft gleich ist und eine andere davon abweicht.
    Da man sich für die daten von R eigentlich nicht interssiiert wird auch nichts gelesen und nur NULL zurückgegeben)
    2)a.)-Tabelle Angestellter:
    ID
    Name
    -Tabelle Manager:
    ID
    AngestelltenID (FK auf Angestellter)
    STUFE
    -Tabelle Sekretaerin:
    ID
    AngestelltenID (FK auf Angestellter)
    AnschlaegeProMinute

    Comment


    • #3
      Hallo,

      vielleicht verdeutlicht das folgende Beispiel den Unterschied zwischen einer leeren Ergebnismenge und einer Ergebnismenge, die nur aus dem NULL-Zustand besteht, besser:

      <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">USE </span>tempdb</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">CREATE TABLE </span>A</p><p style="margin: 0px;">(</p><p style="margin: 0px;">&nbsp; a <span style="color: blue;">INT</span>,</p><p style="margin: 0px;">&nbsp; x <span style="color: blue;">INT</span></p><p style="margin: 0px;">)</p><p style="margin: 0px;">GO</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>A <span style="color: blue;">VALUES </span>(1,2);</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>A <span style="color: blue;">VALUES </span>(11,22);</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>A <span style="color: blue;">VALUES </span>(111,222);</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">CREATE TABLE </span>R</p><p style="margin: 0px;">(</p><p style="margin: 0px;">&nbsp; a <span style="color: blue;">INT</span>,</p><p style="margin: 0px;">&nbsp; x <span style="color: blue;">INT</span></p><p style="margin: 0px;">)</p><p style="margin: 0px;">GO</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>R <span style="color: blue;">VALUES </span>(1,2);</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>R <span style="color: blue;">VALUES </span>(0,22);</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>R <span style="color: blue;">VALUES </span>(111,222);</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">-- liefert nur den 1. und 3. Datensatz von A zurück</span></p><p style="margin: 0px;"><span style="color: blue;">SELECT </span>*</p><p style="margin: 0px;"><span style="color: blue;">FROM </span>&nbsp; A</p><p style="margin: 0px;"><span style="color: blue;">WHERE NOT EXISTS </span>( <span style="color: blue;">SELECT NULL</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: blue;">FROM </span>&nbsp; R</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: blue;">WHERE </span>R.x = A.x <span style="color: blue;">AND </span>R.a != A.a );</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">-- Die Ergebnismenge besteht aus 2 Datensätzen mit dem NULL-Zustand</span></p><p style="margin: 0px;"><span style="color: blue;">SELECT NULL </span></p><p style="margin: 0px;"><span style="color: blue;">FROM </span>R <span style="color: blue;">JOIN </span>A <span style="color: blue;">ON </span>R.a = A.a </p><p style="margin: 0px;"><span style="color: blue;">WHERE </span>R.x = A.x <span style="color: blue;">AND </span>R.a = A.a</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">-- Leere Ergebnismenge </span></p><p style="margin: 0px;"><span style="color: blue;">SELECT NULL </span></p><p style="margin: 0px;"><span style="color: blue;">FROM </span>R <span style="color: blue;">JOIN </span>A <span style="color: blue;">ON </span>R.a = A.a </p><p style="margin: 0px;"><span style="color: blue;">WHERE </span>R.x = A.x <span style="color: blue;">AND </span>R.a != A.a</p><p style="margin: 0px;">GO</p></div>

      Es ist nur ungewöhnlich, dass in der originalen SQL-Abfrage der Zustand NULL abgefordert wird. In der Regel verwendet eine EXISTS-Abfrage den *-Joker, da die Optimierer der SQL Server bei einer EXISTS-Abfrage die SELECT-Ergebnismenge niemals aufbauen, sondern wegoptimieren (zumindestens ist das beim MS SQL Server der Fall).
      Zuletzt editiert von Andreas Kosch; 01.02.2007, 10:02.

      Comment

      Working...
      X