Sohail: Distinct

Hallo,

wie kann man bei der unten stehenden Anweisung das Feld TAB1.Name als Distinct auflisten? So geht es nämlich nicht, weil es da eine zweite Tablle TAB3.Form gibt.

Select Distinct TAB1.Name,TAB1.OID,TAB3.Form From TAB1 JOIN TAB2 ON TAB1.OID=TAB2.OID JOIN TAB3 ON TAB3.ID=TAB2.ID Where SubString(TAB1.Name,1,1)='A' Order by TAB1.Name

Danke im voraus
Sohail

  1. Hallo,

    wie kann man bei der unten stehenden Anweisung das Feld TAB1.Name als Distinct auflisten? So geht es nämlich nicht, weil es da eine zweite Tablle TAB3.Form gibt.

    Distinct dient nur dazu, doppelte Einträge der Ergebnismenge einer Abfrage zu eliminieren. Dabei werdn alle abgefragten Felder berücksichtigt. Sollte sihc auhc eines von einem anderen Record unterscheiden, wird der Record mit ausgegeben. Das bedeutet, daß es durhcaus mehrere Tab1.Name mit unterschiedlichen Tab2.OID bzw Tab3.Form geben kann.
    Du kannst entweder nur Tab1.Name ausgeben lassen, oder GROUP BY TAB1.NAME verwenden. Dabei mußt Du aber bestimmen, welche OID bzw. welche FORM ausgegeben werden soll. Dies könntest Du mit den Aggregatfunktionen wie MIN() oder MAX() erledigen, wobei Du Dir noch überlegen mußt, ob und wenn ja, welche dieser Funktionen für Dein erwartetes Ergebnis die richtige ist.

    Grüße
      Klaus

    1. Hallo Klaus,

      danke für deine Antwort.

      Ich habe es auch mit Group By versucht aber Kein Erfolg gehabt.
      Das mit MIN() oder MAX() kenn ich nicht. Kannst du bitte ein kleines Beispiel bringen.

      Ich kann sagen GROUP BY TAB1.NAME, aber wie kann ich sagen Welche From?

      Sohail

      1. Hallo,

        Ich habe es auch mit Group By versucht aber Kein Erfolg gehabt.
        Das mit MIN() oder MAX() kenn ich nicht. Kannst du bitte ein kleines Beispiel bringen.

        select TABELLE1.FELD1, MAX(TABELLE2.FELD2) from TABELLE1
        JOIN TABELLE2 on TABELLE1.KEYFELD1 = TABELLE2.ANDERESKEYFELD
        group by TABELLE1.FELD1

        Gibt neben TABELLE1.FELD1 auch den maximalwert von TABELLE2.FELD2 aus.

        ... aber wie kann ich sagen Welche From?

        Das ist eben das Problem. Du mußt Dich entscheiden, welchen der potentiell möglichen From-Werte Du wirklich haben willst, den größten Wert (wobei bei Strings 'Z' größer als 'AAAAAAAAAAAA' ist) oder den kleinsten, oder auhc einen Mittelwert (AVG), die Summe aller Werte (SUM) oder was auch immer an Aggregatfunktionen möglich ist. (Wobei ich denke, daß Summen bzw. Mittelwerte bei Strings nicht funktionieren)

        Ihc möchte noch dazu sagen, daß es, je nach Problemstellung, auhc durchaus falsch sein kann, GROUP BY zu verwenden. Aufgrund der von Dir gegebenen Informationen kann ich das aber nicht beurteilen.

        Grüße
          Klaus

        1. HAllo,

          ich bekomme jetzt die richtige Resultate raus mit MIN() bzw. MAX().
          Ich verstehe aber nicht Warum ich mich entscheiden soll?
          Ich will alle Werte aus der erseten Tabelle als Distinct haben, die in verbindung zur zweiten und dritten Tabelle stehen und unter ON- bzw. Where-Clusel fallen.

          Sohail

          1. Hallo,

            Ich will alle Werte aus der erseten Tabelle als Distinct haben, die in verbindung zur zweiten und dritten Tabelle stehen und unter ON- bzw. Where-Clusel fallen.

            Wenn Du sowieso nir Werte aus der ersten Tabelle abfragen willst, warum tust Du es nicht:

            select disting TAB1.NAME,TAB1.WASAUCHIMMERAUSTAB1 from TAB1
            JOIN TAB2 on TAB1.KEYFELD=TAB2.KEYFELD
            where TAB2.WASWEISSICH = 1

            Es zwingt dich ja keiner, auch Felder der 'gejointen' Tabellen abzufragen (in die Feldliste zwischen select und from aufzunehmen).

            Grüße
              Klaus

            1. Hallo Klaus,

              das hätte auch so funktioniert, wenn diese blöde dritte Tabelle nicht wäre.

              Da muss ich ein Feld heraus holen, das über Feld ID von Zwiten Tabelle mit der ersten Tabelle verbunden ist.

              TAB1:
              --------------
              |OID | Name  |
              --------------

              TAB2:
              -----------
              |ID | OID |
              -----------

              TAB3:
              -------------
              |ID | Form  |
              -------------

              Sohail

              1. Hi Sohail

                das hätte auch so funktioniert, wenn diese blöde dritte Tabelle nicht wäre.

                Da muss ich ein Feld heraus holen, das über Feld ID von Zwiten Tabelle mit der ersten Tabelle verbunden ist.

                Du weist schon das Select Felder nur angibt welche Felder zurückhaben
                willst? Innerhalb der Query kannst du trotzdem alle Felder der verwendeten
                Tabellen verwenden und auch danach filtern.

                Gruss Daniela

                1. Hallo Daniela,

                  schön, dass du wieder da bist.
                  Ich habe nicht ganz verstanden, was du meinst.
                  Ich brauche alle Felder, die vor FROM geschrieben habe.
                  Wenn ich die Felder da nicht eintrage, wie kann ich dei dann ansprechen?

                  Sohail

                  1. Hi Sohail

                    schön, dass du wieder da bist.
                    Ich habe nicht ganz verstanden, was du meinst.
                    Ich brauche alle Felder, die vor FROM geschrieben habe.
                    Wenn ich die Felder da nicht eintrage, wie kann ich dei dann ansprechen?

                    Ich bin nicht sicher ob ich dich richtig verstanden habe, brauchst
                    du sie nur innerhalb der Query oder dann auch im Programm das die Query
                    ausführt?

                    Welchen Eintrag von Tabelle 3 der zu Tabelle 1 (über Tabelle 2) passt willst
                    du denn haben? Wenn es nur einen gibt der passt, dann solltest du auch nur
                    den kriegen, sonst musst du genauer sagen (mit Aggregatsfunktionen, also
                    min/max/avg...) was du da denn genau haben willst oder Tabelle 3 in
                    der Where clause einschränken. Die Aggregatsfunktionen benötigen natürlich
                    eine Gruppierung.

                    Gruss Daniela

                    1. Hi,

                      Das Feld Form von Tabelle3. Das ist ein String.
                      Ich muss je nachdem, was im Feld Form steht, die Bilder austauschen.

                      Die Anweisung sieht jetzt so aus und sie funktioniert auch:

                      Select TAB1.Name,TAB1.OID,MIN(TAB3.Form) From TAB1 JOIN TAB2 ON TAB1.OID=TAB2.OID JOIN TAB3 ON TAB3.ID=TAB2.ID Where SubString(TAB1.Name,1,1)='E' Group By TAB1.Name,TAB1.OID Order by TAB1.Name

                      Es ist mit aber nicht ganz wohl dabei, mit MIN.

                      Die Felder TAB1.Name, TAB1.OID und TAB3.Form werden dann übergeben.

                      Sohail

                      1. Hallo,

                        Das Feld Form von Tabelle3. Das ist ein String.
                        Ich muss je nachdem, was im Feld Form steht, die Bilder austauschen.

                        Es ist mit aber nicht ganz wohl dabei, mit MIN.

                        Mir wäre auhc nicht wohl dabei. Dein Problem ist, daß es mehrere Einträge in Tabelle3 gibt, die zu einem Eintrag in Tabelle1 gehören.
                        Welchen der Einträge Du wirklich haben willst, weiß ich bei bestem Willen nicht, und die Datenabnk auhc nicht *g*.
                        Wenn Du nur einen dieser Einträge haben willst, mußt Du Dein Statement so schreiben, daß der richtige herausgefiltert werden kann. Welche Bedingungen dabei berücksichtigt werden müssen, kannst allerdings nur Du entscheiden. MIN() könnte eine der vielen möglichen Lösungen sein, allerdinsg nur dann wenn Du auch wirklich den 'kleinsten' Wert von Form haben willst. Sonst ist es das falsche Mittel zum Ziel.

                        Grüße
                          Klaus

                      2. Hi

                        Das Feld Form von Tabelle3. Das ist ein String.
                        Ich muss je nachdem, was im Feld Form steht, die Bilder austauschen.

                        Ist denn das Form eindeutig pro TAB1 Eintrag? dann sollte das ganze
                        mit min überflüssig sein. Ansonsten musst du schauen das du Form
                        eindeutig spezifizieren kann. So wie du deine Anwendung beschreibst
                        erscheint mir das min auch gefährlich.

                        Gruss Daniela

                        1. Hi,

                          nein. Form ist nicht eindeutig. Da kommen verschiedenen Sachen vor.

                          Da hat man nicht viele möglichkeiten, um die TAB1.Namen eideutig heraus bekommen kann ausser entweder DISTINCT oder aber Group By.

                          Beide funktioniren nicht ohne weiteres.
                          Da erscheint mir Group By eine bessere lösung zu sein. Da mussen aber auch nur die Felder einer Tabelle stehen, sonst knallt es auch.

                          Ich habe es auch mit Select Feld1,Feld2 From (Select Feld3 From TAB3)
                          versucht, da habe ich auch nicht erreicht, was ich wollte.

                          Danke trotzdem.
                          Sohail

                          1. Hallo,

                            nein. Form ist nicht eindeutig. Da kommen verschiedenen Sachen vor.

                            Auch mehrere pro Tab1.Name?
                            Wenn ja, dann mußt DU, wie schon gesagt, entweder mit allen leben, oder Dir einen Eintrag aussuchen. Welches, daß kannst nur Du wissen.

                            Wenn alle Stricke reißen, kannst Du es ja in zwei Statements zerlegen, eines um die Daten aus Tabelle 1  zu bekommen, und ein zweites, welches Du pro zuerstgefundenem Datensatz aufrufst. Aber auhc das ist nicht gerade elegant.
                            Irgendwie mußt Du Dir über die Daten, die DU da speicherst nochmals Gedanken machen. Wenn es richtig ist, daß mehrere Datensätze in Tabelle 3 für einen Datensatz in Tabelle 1 vorkommen können, dann hast Du einen Denkfehler bei Deinem aktuellen Problem. Wenn aber jeder Datensatz aus Tabelle 3 genau einem Datensatz aus Tabelle 1 entsprechen muß, dann stimmt Deine Datenerzeugung bzw. Dein Datenmodell nicht.

                            Da hat man nicht viele möglichkeiten, um die TAB1.Namen eideutig heraus bekommen kann ausser entweder DISTINCT oder aber Group By.
                            Beide funktioniren nicht ohne weiteres.

                            Und beide können genauso falsch, wie auch richtig sein.

                            Da erscheint mir Group By eine bessere lösung zu sein.

                            Nicht zwangsläufig, es kann auch absolut das falsche Ergebnis sein.

                            Da mussen aber auch nur die Felder einer Tabelle stehen, sonst knallt es auch.

                            Nein, es können auch durchaus Felder mehrerer Tabellen sein. Wenn es nicht funktioniert, dann hast DU ein falsches Statement formuliert.

                            ... Feld1,Feld2 From (Select Feld3 From TAB3)

                            Das scheint mir falsch zu sein.
                            select TAB1,FELD1,TAB2.FELD2 from TAB1
                            join TAB2 on TAB1.KEYFELD1 = TAB2.KEYFELD2
                            join TAB3 on TAB2.KEYFELD2A = TAB3.KEYFELD3
                            where TAB3.FELD3 = 'hudriwudri'

                            wäre ein durchaus denkbares Statement.

                            Vielleicht erklärtst Du uns enmal genauer, welche Tabellenstruktur Du hast, wobei auch die Bedeutung der Tabellen und Felder nicht unbedeutend sind.
                            Und dann formulierst Du einmal in deutsch die Abfrage, die Du machen willst. Also irgendwie so:
                            'Ich will wissen welchen Namen, usw. ein Anwender hat, der folgende BEdingungen erfüllt. Außerdem sollten zu diesem Anwender noch foldene Informationen angezeigt werden, die in den Tabellen ... liegen, welche so miteinander verknüpft sind.'

                            Sonst bleibt es für uns einfahc nur abstrakt, was den Dialog zwischen uns einfahc nur kompliziert macht.

                            Grüße
                              Klaus