Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Subselect in Where mit mehreren Ergebnisfeldern im IN-Operator (https://www.delphipraxis.net/178975-subselect-where-mit-mehreren-ergebnisfeldern-im-operator.html)

Jumpy 6. Feb 2014 12:57

Datenbank: egal • Version: egal • Zugriff über: egal

Subselect in Where mit mehreren Ergebnisfeldern im IN-Operator
 
Hallo,

nur aus Neugier. Gibt es so ein Konstrukt:

Code:
Select
  A.*
From
  TabelleA A
Where
  A.Nummer, A.Tag IN (Select Nr, Tag From TabelleB)
Irgendwie dachte ich ich hätte das schon mal gesehen gehabt. Hab es aber bei Oracle nicht ans laufen gekriegt und das durch einen Right Join gelöst, aber die Neugier ist geblieben:

Code:
Select
  A.*
From
  TabelleA A
Right Join
 (Select Nr, Tag From TabelleB) B
On A.Nummer=B.NR
And A.Tag = B.Tag

mkinzler 6. Feb 2014 13:26

AW: Subselect in Where mit mehreren Ergebnisfeldern im IN-Operator
 
Nottfals über

SQL-Code:
 ... A.Nummer || A.Tag IN (Select Nr || Tag From TabelleB)

DeddyH 6. Feb 2014 13:33

AW: Subselect in Where mit mehreren Ergebnisfeldern im IN-Operator
 
Ist das nicht ein stinknormaler INNER JOIN?
SQL-Code:
SELECT
  A.*
FROM
  TabelleA A
JOIN
  TabelleB B ON B.Nr = A.Nummer AND B.Tag = A.Tag
oder meinetwegen auch
SQL-Code:
SELECT
  A.*
FROM
  TabelleA A
WHERE EXISTS (
  SELECT
    *
  FROM
    TabelleB B
  WHERE
    B.Nr = A.Nummer
  AND
    B.Tag = A.Tag  
)

Jumpy 6. Feb 2014 13:37

AW: Subselect in Where mit mehreren Ergebnisfeldern im IN-Operator
 
Zitat:

Zitat von mkinzler (Beitrag 1246947)
Nottfals über

SQL-Code:
 ... A.Nummer || A.Tag IN (Select Nr || Tag From TabelleB)

Stimmt das geht natürlich.

Jumpy 6. Feb 2014 13:39

AW: Subselect in Where mit mehreren Ergebnisfeldern im IN-Operator
 
Zitat:

Zitat von DeddyH (Beitrag 1246951)
Ist das nicht ein stinknormaler INNER JOIN?

Aua. Du hast ja recht.

Mein Right Join funktioniert ja nur weil in A zu jeder NR und Tag Datensätze vorhanden sind.
Ist das mal nicht der Fall, müsste ich ja leere Datensätze bekommen.

Irgendwie hab ich da zu kompliziert gedacht.

jobo 6. Feb 2014 14:19

AW: Subselect in Where mit mehreren Ergebnisfeldern im IN-Operator
 
Ja, gibt es, es fehlt nur die Klammerung auf der linken Seite.
Hab das auch mal irgendwo benutzt, aber weiß nicht mehr warum.

Code:
Select
  A.*
From
  TabelleA A
Where
  (A.Nummer, A.Tag) IN (Select Nr, Tag From TabelleB)
Es wäre zu vermuten, dass ggf. vorhandene Indices hier besser greifen als in der Version mit Konkatenierung. Macht auch mehr Spaß bei nicht String Typen wie Date ...

Jumpy 6. Feb 2014 15:07

AW: Subselect in Where mit mehreren Ergebnisfeldern im IN-Operator
 
Jepp, das war's. Wobei ich die Version mit dem Inner Join jetzt erstmal drin lasse.
Später mach ich dann mal einen Performance-Test, wenn ich richtige Daten habe.

Edit: Ganz vergessen: Danke euch allen! :)

mkinzler 6. Feb 2014 15:10

AW: Subselect in Where mit mehreren Ergebnisfeldern im IN-Operator
 
Zitat:

Es wäre zu vermuten, dass ggf. vorhandene Indices hier besser greifen als in der Version mit Konkatenierung.
Das wird definitv so sein, wenn man nicht einen entsprechenden expression index erzeugt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz