Announcement

Collapse
No announcement yet.

SQL Terra-Datenbank -> Sowohl.. als auch.

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

  • SQL Terra-Datenbank -> Sowohl.. als auch.

    Hallo,

    Ich habe zurzeit SQL in der Schule dran und wir haben ein paar Aufgaben gemacht. Konnte fast alle lösen bis auf die hier:

    Ermitteln Sie die Namen aller Flüsse, die sowohl durch Deutschland als auch durch Österreich fließen. Es kann davon ausgegangen werden, dass die Landesidentifikatoren für Deutschland (D) und für Österreich (A) bekannt sind.

    Die Datenbank ist es:
    Terra

    Mein Ansatz war:
    Code:

    SELECT DISTINCT F.F_NAME, GF.L_ID
    From FLUSS F, GEO_FLUSS GF
    Where F.F_NAME=GF.F_NAME AND (GF.L_ID LIKE "D" AND "A")

    Er gibt mir nun zwar alle Flüsse durch D und durch A aus, aber leider nicht nur den einen, die Donau.

    Was mach ich falsch?

  • #2
    Hi,
    bitte beschreibe wie deine Tabellen genau aufgebaut sind.

    Außerdem kommt mir deine zweite Bedingung vom Syntax her komisch vor:

    [highlight=sql]
    GF.L_ID LIKE "D" AND "A"
    [/highlight]

    And verknüpft zwei Werte logisch miteinander. Es lässt sich also eigentlich nur auf Wahrheitswerte sinnvoll anwenden. Wenn überhaupt müsste es wie Folgt lauten:

    [highlight=sql]
    GF.L_ID LIKE "D" AND GF.L_ID LIKE "A"
    [/highlight]

    Aber ich glaube auch das dürfte in deinem Beispiel falsch sein. dafür müsste ich jedoch den genauen Aufbau der Tabelle kennen. Wird jeder Fluss in der Tabelle GEO_FLUSS für jedes Land eingetragen oder sind in einem Datensatz alle Länder gespeichert?
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

    Viele Grüße Novi

    Comment


    • #3
      Danke ersteinmal.

      Hier der Link der Datenbank:
      http://marvin.sn.schule.de/terra/index.php

      Comment


      • #4
        [highlight=sql]
        SELECT *, COUNT(A.F_NAME) As Anzahl
        FROM (
        SELECT DISTINCT F.F_NAME, GF.L_ID
        FROM FLUSS F, GEO_FLUSS GF
        WHERE F.F_NAME=GF.F_NAME AND (GF.L_ID LIKE "D" OR GF.L_ID LIKE "A")
        ) A
        GROUP BY A.F_NAME HAVING Anzahl = 2
        [/highlight]

        Um es zu verstehen, siehe dir zunächst mal die Innere Abfrage an und probiere sie aus:
        [highlight=sql]
        SELECT DISTINCT F.F_NAME, GF.L_ID
        FROM FLUSS F, GEO_FLUSS GF
        WHERE F.F_NAME=GF.F_NAME AND (GF.L_ID LIKE "D" OR GF.L_ID LIKE "A")
        [/highlight]

        Wenn du es nicht verstehen solltest, vereinfache die Abfrage erstmal in diese:
        [highlight=sql]
        SELECT F.F_NAME, GF.L_ID
        FROM FLUSS F, GEO_FLUSS GF
        WHERE F.F_NAME=GF.F_NAME AND (GF.L_ID LIKE "D" OR GF.L_ID LIKE "A")
        [/highlight]
        "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

        Viele Grüße Novi

        Comment


        • #5
          Dankeschön.

          Hätte ich nie mit meinen SQL-Kenntnissen hinbekommen.

          Comment


          • #6
            Zudem war der Entwerfer der Datenbank ein großer SQL-Spezialist

            Comment


            • #7
              Hallo,
              Originally posted by Novi View Post
              [highlight=sql]
              SELECT *, COUNT(A.F_NAME) As Anzahl
              FROM (
              SELECT DISTINCT F.F_NAME, GF.L_ID
              FROM FLUSS F, GEO_FLUSS GF
              WHERE F.F_NAME=GF.F_NAME AND (GF.L_ID LIKE "D" OR GF.L_ID LIKE "A")
              ) A
              GROUP BY A.F_NAME HAVING Anzahl = 2
              [/highlight]
              Das ist etwas "überdimensioniert" und auch syntaktisch falsch! Die Group By-Klausel enthält nur A.F_NAME. Es müssen jedoch ALLE Felder aufgeführt werden, die im Select-Teil enthalten und keine Aggregatfunktionen sind. Das wären in diesem Fall (wegen *) die Felder A.F_NAME und A.L_ID.
              Zudem ist die Verwendung von Like OHNE Platzhalter im Suchstring etwas unsinnig und String-Literale werden in SQL in einfache und nicht in doppelte Hochkomma geschrieben.

              Mein Vorschlag:
              [highlight=sql]
              select GF.F_NAME
              FROM GEO_FLUSS GF
              WHERE GF.L_ID in ('D', 'A')
              group by GF.F_NAME
              having count(distinct GF.L_ID) = 2
              [/highlight]

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo Falk Prüfer

                Originally posted by Falk Prüfer View Post
                Das ist etwas "überdimensioniert" und auch syntaktisch falsch! Die Group By-Klausel enthält nur A.F_NAME. Es müssen jedoch ALLE Felder aufgeführt werden, die im Select-Teil enthalten und keine Aggregatfunktionen sind. Das wären in diesem Fall (wegen *) die Felder A.F_NAME und A.L_ID.
                Zudem ist die Verwendung von Like OHNE Platzhalter im Suchstring etwas unsinnig und String-Literale werden in SQL in einfache und nicht in doppelte Hochkomma geschrieben.
                mit deinen Anmerkungen hast du natürlich recht. Ich habe die Like einfach aus dem bestehenden Anfrage übernommen ohne es zu überdenken.

                Originally posted by Falk Prüfer View Post
                Mein Vorschlag:
                [highlight=sql]
                select GF.F_NAME
                FROM GEO_FLUSS GF
                WHERE GF.L_ID in ('D', 'A')
                group by GF.F_NAME
                having count(distinct GF.L_ID) = 2
                [/highlight]
                Ich wollte es zunächst auch so ähnlich lösen. Ehrlich gesagt habe ich aber den Fehler gemacht und count(distinct GF.F_NAME) verwendet, was natürlich nicht funktioniert. Da hätte ich eigentlich selbst drauf kommen müssen . Naja so bin ich halt zu der überdimensionierten Lösung gekommen.
                "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

                Viele Grüße Novi

                Comment

                Working...
                X