Join

Guten Morgen zusammen,

ich habe mir am Wochenende über ein Problem den Kopf zerbrochen und möchte euch nun um Hilfe bitten. Es geht um einen Join zweier Tabellen, der nicht das erwartete Ergebnis liefert. Folgende Konstellation:

Tabelle 1 Gutachten (valuations):

gv-test-01=# select id AS val_id, ref_number, ref_name, dt_completition from valuations;
 val_id | ref_number |    ref_name     |      dt_completition
--------+------------+-----------------+----------------------------
      1 | A-001      | Testgutachten 1 | 2014-04-05 11:17:39.868439
      2 | B-001      | Testgutachten 2 | 2014-04-05 11:21:27.365477
      3 | A-002      | Testgutachten 3 | 2014-04-05 11:21:35.202647
      4 | C-001      | Testgutachten 4 | 2014-04-05 11:21:41.086415
      5 | C-002      | Testgutachten 5 | 2014-04-05 16:22:34.090829
(5 rows)

Tabelle 2 Baulasten (public_easements):

gv-test-01=# select id AS pe_id, valuations_id, _public_easements_id from public_easements;
 pe_id | valuations_id | _public_easements_id
-------+---------------+----------------------
     1 |             1 |                    1
     2 |             1 |                    2
     3 |             1 |                    3
     4 |             1 |                    4
     5 |             1 |                    5
     6 |             2 |                    6
     7 |             2 |                    7
     8 |             2 |                    8
     9 |             2 |                    9
    10 |             3 |                   10
    11 |             3 |                   11
    12 |             3 |                   12
    13 |             4 |                   13
    14 |             4 |                   14
    15 |             5 |                   15
(15 rows)

Der Vollständigkeit halber die dritte Tabelle (Stammdaten für die Baulasten):

gv-test-01=# select id AS _pe_id, public_easement from _public_easements;
 _pe_id |     public_easement
--------+-------------------------
      1 | Abstandsbaulast
      2 | Altenteil
      3 | Auflassungsvormerkung
      4 | Bauverbot
      5 | Betriebsbeschränkung
      6 | Dauernutzungsrecht
      7 | Erbbaurecht
      8 | Flächenbaulast
      9 | Leitungsrecht
     10 | NieÃbrauch
     11 | Notweg
     12 | Reallast
     13 | Sanierungsverfahren
     14 | Tankstellenrecht
     15 | Ãberbau
     16 | Umlegungsvermerk
     17 | Vorkaufsrecht
     18 | Wegerecht
     19 | Wohnrecht
     20 | Wohnungsbesetzungsrecht
(20 rows)

Ich habe nun folgenden Join, der ein sinnvolles Ergebnis liefert:

gv-test-01=# SELECT
gv-test-01-#   valuations.id,
gv-test-01-#   valuations.ref_number,
gv-test-01-#   valuations.ref_name,
gv-test-01-#   valuations.dt_completition
gv-test-01-# FROM
gv-test-01-#   public.valuations,
gv-test-01-#   public.public_easements
gv-test-01-# WHERE
gv-test-01-#   valuations.id = public_easements.valuations_id AND
gv-test-01-#   public_easements._public_easements_id = 1
gv-test-01-# GROUP BY
gv-test-01-#   valuations.id,
gv-test-01-#   valuations.ref_number,
gv-test-01-#   valuations.ref_name,
gv-test-01-#   valuations.dt_completition;
 id | ref_number |    ref_name     |      dt_completition
----+------------+-----------------+----------------------------
  1 | A-001      | Testgutachten 1 | 2014-04-05 11:17:39.868439
(1 row)

Dieses Gutachten hat aber noch mehr Baulasten, wenn ich die Abfrage um eine weitere ergänze, finde ich kein Ergebnis mehr:

gv-test-01=# SELECT
gv-test-01-#   valuations.id,
gv-test-01-#   valuations.ref_number,
gv-test-01-#   valuations.ref_name,
gv-test-01-#   valuations.dt_completition
gv-test-01-# FROM
gv-test-01-#   public.valuations,
gv-test-01-#   public.public_easements
gv-test-01-# WHERE
gv-test-01-#   valuations.id = public_easements.valuations_id AND
gv-test-01-#   public_easements._public_easements_id = 1 AND
gv-test-01-#   public_easements._public_easements_id = 2
gv-test-01-# GROUP BY
gv-test-01-#   valuations.id,
gv-test-01-#   valuations.ref_number,
gv-test-01-#   valuations.ref_name,
gv-test-01-#   valuations.dt_completition;
 id | ref_number | ref_name | dt_completition
----+------------+----------+-----------------
(0 rows)

Nach meinem Verständnis (Wunsch) hätte ich auch das Gutachten mit der ID 1 finden wollen. Könnt ihr mit bitte gedanklich auf die Sprünge helfen.

1000 Dank!

Andreas

Du erwartest, daß

gv-test-01-#   public_easements._public_easements_id = 1 AND
gv-test-01-#   public_easements._public_easements_id = 2

Also, daß wenn public_easements._public_easements_id = 1 gilt gleichzeitig auch public_easements._public_easements_id = 2, also 1 = 2 gilt, ja?

Du suchst OR oder IN (…)

Andreas

Moin Andreas :slight_smile:

Fast, hab’s getestet:

gv-test-01=# SELECT
gv-test-01-#   valuations.id,
gv-test-01-#   valuations.ref_number,
gv-test-01-#   valuations.ref_name,
gv-test-01-#   valuations.dt_completition
gv-test-01-# FROM
gv-test-01-#   public.valuations,
gv-test-01-#   public.public_easements
gv-test-01-# WHERE
gv-test-01-#   valuations.id = public_easements.valuations_id AND
gv-test-01-#   public_easements._public_easements_id IN (1, 2)
gv-test-01-# GROUP BY
gv-test-01-#   valuations.id,
gv-test-01-#   valuations.ref_number,
gv-test-01-#   valuations.ref_name,
gv-test-01-#   valuations.dt_completition;
 id | ref_number |    ref_name     |      dt_completition
----+------------+-----------------+----------------------------
  1 | A-001      | Testgutachten 1 | 2014-04-05 11:17:39.868439
(1 row)

Hier stimmt das Ergbnis - schon mal besser als meine Abfrage. Aber, wenn ich eine Baulast mit einbringe, die einem anderen Gutachten zugeordnet ist (BaulastID 6 ist GutachtenID 2 zugeordnet), findet die Abfrage nun beide - erwarten würde ich keines.

gv-test-01=# SELECT
gv-test-01-#   valuations.id,
gv-test-01-#   valuations.ref_number,
gv-test-01-#   valuations.ref_name,
gv-test-01-#   valuations.dt_completition
gv-test-01-# FROM
gv-test-01-#   public.valuations,
gv-test-01-#   public.public_easements
gv-test-01-# WHERE
gv-test-01-#   valuations.id = public_easements.valuations_id AND
gv-test-01-#   public_easements._public_easements_id IN (1, 2, 6)
gv-test-01-# GROUP BY
gv-test-01-#   valuations.id,
gv-test-01-#   valuations.ref_number,
gv-test-01-#   valuations.ref_name,
gv-test-01-#   valuations.dt_completition;
 id | ref_number |    ref_name     |      dt_completition
----+------------+-----------------+----------------------------
  1 | A-001      | Testgutachten 1 | 2014-04-05 11:17:39.868439
  2 | B-001      | Testgutachten 2 | 2014-04-05 11:21:27.365477
(2 rows)

Ich möchte also nur die Gutachten finden, bei den alle Attribute zutreffen. Any idea :smiley:

Ach so.

Du hast:

test=*# select * from murphy ;
 o | val
---+-----
 1 |   4
 1 |   6
 1 |   5
 2 |   4
 2 |   5
(5 rows)

und suchst alls o’s, wo val in (4,6) ist, ja?

test=*# select o, count(o) from murphy where val in (4,6) group by o having count(o) >= 2;
 o | count
---+-------
 1 |     2
(1 row)

Das anzupassen überlasse ich Dir zur Übung :wink:

Hmmm, wieder mal klappt die von dir vorgeschlagene Abfrage im ersten Anlauf - aber ich habe da sicher noch nen Fehler drin. Ich habe dein Bespiel mal nachgebaut und leicht modifiziert:

gv-test-01=# select o, val from murphy;
 o | val
---+-----
 1 |   1
 1 |   2
 1 |   3
 2 |   4
 2 |   5
(5 rows)

Die erste Abfrage ist super und liefert das richtige Ergebnis:

gv-test-01=# select o, count(o) from murphy where val in (1,2) group by o having count(o) >= 2;
 o | count
---+-------
 1 |     2
(1 row)

Die zweite Abfrage liefert ein für mich noch immer unverständliches Ergebnis:

gv-test-01=# select o, count(o) from murphy where val in (1,2,5) group by o having count(o) >= 2;
 o | count
---+-------
 1 |     2
(1 row)

Ich wollte alle Datensätze, für die es val 1 und 2 und 5 gibt - aber davon gibt es keinen. Trotzdem finde ich o 1.

Laß mich raten, ich habe die Übung nicht bestanden :wink:

Edit: Ich habe das Gefühl, das IN(…) sucht nach einem logischen OR, was ich mir vorstelle, wäre ein AND.

Jupps. Wenn Du auf 3 Werte prüfst, dann müssen da auch 3 Resultate sein - nicht nur 2.

Ah, click

Sorry, ich stand auf’m Schlauch… Völlig cool - danke. Wohin geht die Packung Bratwurst (PN)?