AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Params im ADOQuery nicht angenommen.
Thema durchsuchen
Ansicht
Themen-Optionen

Params im ADOQuery nicht angenommen.

Ein Thema von ahachmann · begonnen am 17. Feb 2004 · letzter Beitrag vom 17. Feb 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#11

Re: Params im ADOQuery nicht angenommen.

  Alt 17. Feb 2004, 14:07
[Edit]Und auch hier habe ich noch nicht nachgedacht:[/Edit]
Hi Alex!

Ich verstehe Deine Ausführungen, aber in Bezug auf Die Query muß ich bei meiner Einschätzung bleiben - sie ist definitiv gleich select * from Stopper - d.h. Du erreichst das gewünschte Ziel so nicht.
Was Du tust ist nämlich:

Select * from Tabelle Where Bedingung
+
Select * from Tabelle Where nicht Bedingung
=
Select * from Tabelle ohne Bedingung

Wenn Du mir eine Tabellendefinition gibst, formulier ich Dir gern ein Statement, das auch tut, was Du von ihm erwartest.

Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
ahachmann

Registriert seit: 15. Sep 2003
Ort: Hamburg
54 Beiträge
 
Delphi 7 Professional
 
#12

Re: Params im ADOQuery nicht angenommen.

  Alt 17. Feb 2004, 14:21
Das Statement funktionert bei mir aber.
Die WHERE NOT EXISTS Bedinung gibt true oder false zurück, je nachdem ob schon ein Röhrchen in der Tabelle der r_articlesproduct ist oder nicht. Sobald keines mehr drinne ist, wird WHERE NOT EXISTS immer True und alle Stopper werden ausgegeben. Wenn nun aber ein Röhrchen in der Relation drinne ist, dann ist es immer false. Somit wird das UNION Select leer sein und nur die Obere Select Anweisung wirft Datensätze aus.
Aber für Bessere Lösungen bin ich immer offen.

Vielen Dank,
Alexander
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#13

Re: Params im ADOQuery nicht angenommen.

  Alt 17. Feb 2004, 15:06
OffTopic:
Wie interpretiert die DB diese Statements (vorsicht sehr lang!)

DB: Oracle

Der dargestellte "explain plan" zeigt in welcher Reihenfolge welche Operation ausgeführt wurde.


Not Exists mit SELECT *
SQL-Code:
SELECT t.PkSeq,
       t.PkDTc,
       t.PkYN,
       t.PkHH,
       t.PkMM,
       t.PkDT,
       t.PkTM,
       t.SubKey
FROM MM07.PKPROFLO_update t
WHERE Not Exists (SELECT *
                   FROM MM07.ENROLL_data e
                   WHERE e.Subject_ID = t.Subject_ID)
ORDER By t.PkSeq
Optimizer Plan:

Code:
                                             Cost Cardinality Optimizer      Options        Operation           Timestamp          Bytes  
SELECT STATEMENT, GOAL = CHOOSE                3       1       CHOOSE                         SELECT STATEMENT    17.02.2004 15:53:50            101   
 SORT ORDER BY                                 3       1                       ORDER BY       SORT                17.02.2004 15:53:50            101   
  FILTER                                                                                       FILTER              17.02.2004 15:53:50               
   TABLE ACCESS FULL  MM07   PKPROFLO_UPDATE  1       1       ANALYZED       FULL           TABLE ACCESS        17.02.2004 15:53:50            101   1 
   INDEX UNIQUE SCAN  MM07   ENROLL_DBIDX     1       1                       UNIQUE SCAN    INDEX               17.02.2004 15:53:50            3
__________________________________________________ __________________________________________________ _______________________

Not Exists mit SELECT 1 num. Spalte
SQL-Code:
SELECT t.PkSeq,
       t.PkDTc,
       t.PkYN,
       t.PkHH,
       t.PkMM,
       t.PkDT,
       t.PkTM,
       t.SubKey
FROM MM07.PKPROFLO_update t
WHERE Not Exists (SELECT e.Subject_ID
                   FROM MM07.ENROLL_data e
                   WHERE e.Subject_ID = t.Subject_ID)
ORDER By t.PkSeq
Optimizer Plan:
Code:
SELECT STATEMENT, GOAL = CHOOSE                3       1       CHOOSE                         SELECT STATEMENT    17.02.2004 15:54:08            101   
 SORT ORDER BY                                 3       1                       ORDER BY       SORT                17.02.2004 15:54:08            101   
  FILTER                                                                                       FILTER              17.02.2004 15:54:08               
   TABLE ACCESS FULL  MM07   PKPROFLO_UPDATE  1       1       ANALYZED       FULL           TABLE ACCESS        17.02.2004 15:54:08            101   1 
   INDEX UNIQUE SCAN  MM07   ENROLL_DBIDX     1       1                       UNIQUE SCAN    INDEX               17.02.2004 15:54:08            3
__________________________________________________ _________________________________

Not in (SELECT...)
SQL-Code:
SELECT t.PkSeq,
       t.PkDTc,
       t.PkYN,
       t.PkHH,
       t.PkMM,
       t.PkDT,
       t.PkTM,
       t.SubKey
FROM MM07.PKPROFLO_update t
WHERE t.Subject_ID Not In (SELECT e.Subject_ID
                            FROM MM07.ENROLL_data e)
ORDER By t.PkSeq
Optimizer:
Code:
SELECT STATEMENT, GOAL = CHOOSE                3       1       CHOOSE                         SELECT STATEMENT    17.02.2004 15:54:08            101   
 SORT ORDER BY                                 3       1                       ORDER BY       SORT                17.02.2004 15:54:08            101   
  FILTER                                                                                       FILTER              17.02.2004 15:54:08               
   TABLE ACCESS FULL  MM07   PKPROFLO_UPDATE  1       1       ANALYZED       FULL           TABLE ACCESS        17.02.2004 15:54:08            101   1 
   INDEX UNIQUE SCAN  MM07   ENROLL_DBIDX     1       1                       UNIQUE SCAN    INDEX               17.02.2004 15:54:08            3
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#14

Re: Params im ADOQuery nicht angenommen.

  Alt 17. Feb 2004, 15:08
Wie man sieht, ist es für die DB egal, ob man not in () oder not Eists() verwendet.
"In ()" und "Exists ()" sind aber nicht äquivalent!!!
  Mit Zitat antworten Zitat
ahachmann

Registriert seit: 15. Sep 2003
Ort: Hamburg
54 Beiträge
 
Delphi 7 Professional
 
#15

Re: Params im ADOQuery nicht angenommen.

  Alt 17. Feb 2004, 15:15
Ähh, da hast Du halb recht.
Denn SELECT * FROM Stopper WHERE NOT EXISTS () ist was anderes als
SELECT * FROM Stopper WHERE article_id NOT IN ().

Die Obere Bedingung verknüpft nicht mit einem Attribut im SELECT, sondern ist WHERE 1 oder WHERE 0;
Somit werden alle angezeigt, wenn es keine Tube in r_articlesproduct gibt.

Wenn es welche gibt, muß dann noch die Bedingung artcile_id NOT IN () stimmen.
Somit ist es nicht die direkte verneinung.

(A ^ B) v (C ^ not B)

A = Select FROM Stopper Where NOT EXISTS B
C = Select FROM Stopper Where article ID IN B
B = Die Menge der Röhrchen die Zu dem Produkt gehören.


gruß,
Alexander
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#16

Re: Params im ADOQuery nicht angenommen.

  Alt 17. Feb 2004, 15:18
Es ging mir hauptsächlich darum, dass ein Select * in einen NOT Exists nicht langsamer als ein Select ID ist.
Ich habe einfach eine Abfrage genommen, die ich gerade in irgendeinem Fenster hatte und habe sie danch umgeformt.
Im diesem Fall sind alle 3 Abfragen absolut identisch!
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#17

Re: Params im ADOQuery nicht angenommen.

  Alt 17. Feb 2004, 15:25
@George: das wiederum hängt stark vom Optimizer der verwendeten DB ab, und ist somit keine verläßliche Größe - das mit dem Stern kann man sich abgewöhnen. Tut nicht weh. und ist im Zweifel schneller. Und gerade bei komplexeren Querys kann man somit dem Optimizer (so er vorhanden/gut ist) unter die Arme greifen.
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#18

Re: Params im ADOQuery nicht angenommen.

  Alt 17. Feb 2004, 15:50
@ahachmann: Ich muß Abbitte leisten! Du hast Recht, was das Not Exists angeht.
Da hatte Ich einen Knoten im Kopf der in Richtung: "where id not in(...)" ging.
Sorry!

*AschekübelNimmtUndÜberKopfStülpt*
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#19

Re: Params im ADOQuery nicht angenommen.

  Alt 17. Feb 2004, 16:01
Jeweils 1 join eingespart:
SQL-Code:
    SELECT S.*
      FROM r_articleproduct AP

INNER JOIN r_tubestopper TS
        ON TS.tube_id = AP.article_id

INNER JOIN stopper S
        ON S.article_id = AP.article_id
       AND S.article_id = TS.stopper_id

     WHERE AP.name = 'test'

UNION

     SELECT *
       FROM stopper

      WHERE NOT EXISTS( SELECT S.*
                              FROM r_articleproduct AP
                        INNER JOIN r_tubestopper TS
                                ON TS.tube_id = AP.article_id
                        INNER JOIN stopper S
                                ON S.article_id = AP.article_id
                               AND S.article_id = TS.stopper_id
                             WHERE AP.name = 'test'
                       )
[Edit]Konnte auf diese Abkürzung nur kommen, weil mir ahachmann per PN das DB-Modell
zukommen lassen hat - aus dem ursprünglichen Post wäre man wohl nicht darauf gekommen.[/Edit]
*BlamageSchweissVonStirnWischt*
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:17 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