Marcus: SQL - Statement von 2 Datenbanken

Mahlzeit !

Ich möchte über ein Suchformular (ASP) bestimmte
Daten suchen lassen.

Die Daten stehen in 2 Accesstabellen, von den
variablen sind bei identisch.

Gebe ich jetzt einen suchbegriff ein dann kommt folgende
Fehlermeldung:

Microsoft OLE DB Provider for ODBC Drivers-Fehler '80004005'

[Microsoft][ODBC Microsoft Access 97 -Treiber] Das angegebene Feld 'subject' kann sich auf mehr als eine der Tabellen beziehen, die im FROM-Abschnitt der SQL-Anweisung angegeben werden.

/telekom/mails/mail_suchergebnis.asp, Zeile 25

----------------------------------------------------
Hier kommt jetzt ein auszug aus mein quellcode:

Set conn = Server.CreateObject("ADODB.Connection")
conn.open "tmail","",""
Set Session("tmail_conn") = conn
SQL = "Select * from mail, dtag where subject Like '%"& Request.QueryString("auftrag") &"%'"
SQL = SQL & "And subject Like '%" & Request.Querystring("name") & "%'"
SQL = SQL & "And inhalt Like '%" & Request.Querystring("inhalt") & "%'"
SQL = SQL & "ORDER BY ID DESC"
Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open sql, conn, 3, 3
IF rs.BOF AND rs.EOF Then
Response.Redirect "mail_suchergebnis_error.htm"
-------------------------------------------------------

Kann mir jemand sagen was ich falsch mache und mir
vielleicht einige Tips gibt ?!

Vielen Dank !

cu

Marcus

  1. Die Daten stehen in 2 Accesstabellen, von den
    variablen sind bei identisch.

    ... und das führt zu Deinem Problem

    [Microsoft][ODBC Microsoft Access 97 -Treiber] Das angegebene Feld 'subject' kann sich auf mehr als eine der Tabellen beziehen, die im FROM-Abschnitt der SQL-Anweisung angegeben werden.

    Offenbar tritt das Feld "subject" in mehr als einer Tabelle auf, und das führt dazu, daß das von Dir verwendete SQL-Statement Probleme bekommt, weil ...

    SQL = "Select * from mail, dtag where ...

    "Select *" bedeutet: Selektiere alle Felder und gib ihnen (erst mal) jeweils den Namen, den sie in ihrer Originaltabelle hatten. (Denn das Ergebnis eines SELECT kann selbst wiederum in bestimmten Fällen wie eine Tabelle weiterverarbeitet werden - deshalb müssen die Feldnamen eindeutig sein. Und das sind sie bei Dir eben nicht.

    Kann mir jemand sagen was ich falsch mache und mir
    vielleicht einige Tips gibt ?!

    Du erzeugst ein Ergebnis, in dem zwei Spalten mit demselben Namen auftreten.
    Brauchst Du denn wirklich beide?
    (Du hast keinen JOIN über sie durchgeführt, sie scheinen also verschiedene Werte zu enthalten - oder Du hast überhaupt vergessen, genau das zu tun ...).

    Du könntest die zu selektiertenden Felder alle einzeln zwischen SELECT und FROM auflisten (das ist halt Schreibarbeit - aber wahrscheinlich brauchst Du sowieso nicht alle Felder ...) und dann entweder nur eines der beiden "Subject"-Felder nehmen oder eines der beiden dynamisch umbenennen (indem Du OHNE Komma einen alias-Namen direkt dahinter schreibst).

    In der Aufzählung müssen die beiden Felder dann natürlich eindeutig identifizierbar sein, also nicht "select inhalt, subject, ... from ...", sondern "select inhalt, mail.subject, dtag.subject, ... from ...". Den Tabellennamen darfst Du weglassen, wenn der Feldname eindeutig ist - aber eben *nur* dann.

    1. Hallo

      In der Aufzählung müssen die beiden Felder dann natürlich eindeutig identifizierbar sein, also nicht "select inhalt, subject, ... from ...", sondern "select inhalt, mail.subject, dtag.subject, ... from ...". Den Tabellennamen darfst Du weglassen, wenn der Feldname eindeutig ist - aber eben *nur* dann.

      Eine kleine Ergänzung:

      Zur Vereinfachung des weiteren Zugriffs (aus weiteren SQL-Statements) können die 'vollqualifizierten' Feldnamen mit einem 'Alias' abgekürzt werden:

      SELECT mail.id AS id, mail.subject AS mailsubject, dtag.subject AS subject
      FROM mail, dtag
      WHERE mail.id=dtag.id

      Weiter können auch die Tabellennamen in der FROM-Klausel mit einem Alias abgekürzt werden:

      SELECT m.id, m.subject, d.subject
      FROM mail AS m, dtag AS d
      WHERE m.id=d.id

      Dies sollte unter diversen SQL-Engines laufen, ist jedoch nur auf MS-SQL und MS Access erprobt.

      Grüsse

      Tom

      1. Zur Vereinfachung des weiteren Zugriffs (aus weiteren SQL-Statements) können die 'vollqualifizierten' Feldnamen mit einem 'Alias' abgekürzt werden:

        Das war das, was ich mit "dynamisch umbenennen" meinte.

        Dies sollte unter diversen SQL-Engines laufen, ist jedoch nur auf MS-SQL und MS Access erprobt.

        Bei Oracle (was ich für Standard-SQL halte) ist kein "AS" anzugeben.