2008-11-25 4 views
8

Bei der Ausführung der folgenden (komplett) SQL-Abfrage auf Microsoft SQL Server 2000:Mehrdeutige Spaltenname Fehler

SELECT B.ARTIFACTTNS, B.ARTIFACTNAME, B.ARTIFACTTYPE, B.INITIALBYTES, B.TIMESTAMP1, B.FILENAME, B.BACKINGCLASS, 
     B.CHARENCODING, B.APPNAME, B.COMPONENTTNS, B.COMPONENTNAME, B.SCAMODULENAME, B.SCACOMPONENTNAME 
FROM (SELECT DISTINCT A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME 
     FROM (SELECT DISTINCT ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME 
      FROM CUSTPROPERTIES WHERE PNAME = 'AcmeSystemName' AND PVALUE = 'MyRuleGroup' 
        UNION SELECT DISTINCT ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME 
          FROM CUSTPROPERTIES WHERE PNAME = 'AcmeSystemDisplayName' AND PVALUE = 'MyRuleGroup') A, 
      (SELECT DISTINCT ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME 
      FROM CUSTPROPERTIES WHERE PNAME = 'AcmeSystemTargetNameSpace' AND PVALUE = 'http://MyModule') B 
WHERE A.ARTIFACTTYPE = B.ARTIFACTTYPE AND A.ARTIFACTTNS = B.ARTIFACTTNS AND A.ARTIFACTNAME = B.ARTIFACTNAME) A, BYTESTORE B 
    WHERE (A.ARTIFACTTYPE = 'BRG') AND A.ARTIFACTTYPE = B.ARTIFACTTYPE AND A.ARTIFACTTNS = B.ARTIFACTTNS AND A.ARTIFACTNAME = B.ARTIFACTNAME 
    ORDER BY ARTIFACTTYPE, ARTIFACTTNS, ARTIFACTNAME 

Ich erhalte die folgende Ausnahme:

java.sql.SQLException: [Acme][SQLServer JDBC Driver][SQLServer] 
    Ambiguous column name 'ARTIFACTTYPE'. 

Was mache ich hier falsch machen und wie kann ich das korrigieren?

+0

Sie können jede einzelne in Ihrer Abfrage loswerden. –

+0

Es sieht auch so aus, als ob Sie eine "One True Lookup Table" erstellt haben, ein Datenmodellierungsfehler, so dass es einen eigenen Namen hat. Obwohl ich mich irren könnte, sieht das Muster Oh! so vertraut. Google diesen Begriff. –

Antwort

24

Da ARTIFACTTYPE kann sich entweder auf A.ARTIFACTTYPE oder B.ARTIFACTTYPE und der Server muss wissen, welche Sie wollen, ist es nur zu A.ARTIFACTTYPE ändern und Sie sollten in diesem Fall in Ordnung sein.

Um zu verdeutlichen, müssen Sie das Alias-Präfix jedes Mal angeben, wenn der Spaltenname mehrdeutig ist. Es ist keine schlechte Übung, immer Alias-Präfixe zu verwenden, da es deutlich macht, welche Spalten aus welchen Tabellen stammen, wenn Sie die Abfrage lesen, und Probleme wie diese beseitigt.

Man könnte sich fragen, warum man zwischen zwei Spalten unterscheiden muss, wenn beide auf dieselbe Spalte in derselben Tabelle verweisen. Die Antwort besteht darin, dass die Werte von A.column und B.column abhängig von den Join-Kriterien unterschiedlich sein können, wenn Sie eine Tabelle mit sich selbst verknüpfen (z. B. bei einem äußeren Join, bei dem Werte in einer der Spalten vorkommen können) Null).

+0

Für was ist die Abstimmung unten? –

+0

Weil ich aufgrund meiner eigenen Antwort nicht weiß, warum irgendetwas in dieser Abfrage mehrdeutig ist. Insbesondere sehe ich keinen unqualifizierten ARTIFACTTYPE, wo das Hinzufügen eines A oder B sinnvoll wäre. Ihre Erklärung, was Ambiguität bedeutet, ist in Ordnung, aber ich vermute, dass das OP alles versteht. –

+1

Dank Dave, nachdem ich die Abfrage sorgfältiger betrachtet habe, erscheint es nicht, dass es irgendwelche Mehrdeutigkeiten gibt, obwohl ich Datenbanken verwendet habe, die sehr wählerisch sind, Aliase zu erzwingen, könnte SQL Server einer von ihnen sein. In jedem Fall, unabhängig von der gestellten Anfrage, adressiert meine Antwort eindeutig den gemeldeten Fehler. –

0

Um klar zu sein, sind es Zeilen 13, 14 und 15, die die mehrdeutigen Spalten haben.

+0

Warum? Warum sollten diese Zeilen mehrdeutig sein, aber die Zeilen 5, 6 und 7 nicht? –

+0

Ich dachte gleich das gleiche, aber nachdem ich mir den Code näher angesehen habe, würde ich Dave unterstützen – kristof

+0

Nicht sicher, warum diese Zeilen nicht eindeutig sind. Ich sage dir nur, was mgmt studio sagt. Der 8 Jahre alte DB Server könnte etwas damit zu tun haben. Ich nehme an, Sie haben dies auf SQL Server 2000 wie das ursprüngliche Poster angegeben versucht. Danke für die Down-Stimmen, ohne es sogar auf SQL 2000 zu versuchen. – Logicalmind

2

Wenn das die genaue Abfrage ist, die Sie ausführen, habe ich keine Ahnung, warum es etwas mehrdeutig finden würde.

Ich schrieb, was ich denke, ist eine gleichwertige Abfrage und lief es in meiner Datenbank (Oracle) ohne Problem.

BEARBEITEN Hinzufügen der genauen Ausgabe eines neuen Experiments in Oracle. Die Abfrage, die in diesem Experiment ausgeführt wird, ist die genaue Abfrage, die vom OP mit dem Tabellenname ausgefüllt wird. KEINE ANDEREN ÄNDERUNGEN. In dieser Abfrage gibt es nichts Unklares. Entweder ist das nicht die genaue Abfrage, die ausgeführt wird, oder SQL Server hat einen Parser-Fehler.

SQL> create table props (pname varchar2(100), 
    2      pvalue varchar2(100), 
    3      artifacttype number, 
    4      artifacttns number, 
    5      artifactname number); 

Table created. 

SQL> SELECT  
    2 DISTINCT A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME 
    3 FROM 
    4 (SELECT DISTINCT 
    5  ARTIFACTTYPE, 
    6  ARTIFACTTNS, 
    7  ARTIFACTNAME 
    8 FROM props 
    9 WHERE PNAME = 'AcmeSystemName' 
10  AND PVALUE = 'MyRuleGroup' 
11 UNION 
12 SELECT DISTINCT 
13  ARTIFACTTYPE, 
14  ARTIFACTTNS, 
15  ARTIFACTNAME 
16 FROM props 
17 WHERE PNAME = 'AcmeSystemDisplayName' 
18  AND PVALUE = 'MyRuleGroup') A, 
19 (SELECT DISTINCT 
20  ARTIFACTTYPE, 
21  ARTIFACTTNS, 
22  ARTIFACTNAME 
23 FROM props 
24 WHERE PNAME = 'AcmeSystemTargetNameSpace' 
25  AND PVALUE = 'http://mymodule') B 
26 WHERE A.ARTIFACTTYPE = B.ARTIFACTTYPE 
27  AND A.ARTIFACTTNS = B.ARTIFACTTNS 
28  AND A.ARTIFACTNAME = B.ARTIFACTNAME 
29/

no rows selected 

Ende bearbeiten

Mein Vorschlag um den Fehler zu bekommen ist die Tabelle in jeder select-Klausel einen eindeutigen Alias ​​zu geben und alle Spaltenreferenzen zu qualifizieren. Gefällt mir:

SELECT 
    DISTINCT A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME 
FROM 
(SELECT DISTINCT 
    P1.ARTIFACTTYPE, 
    P1.ARTIFACTTNS, 
    P1.ARTIFACTNAME 
    FROM {PROPERTIES_TABLE_NAME} P1 
    WHERE PNAME = 'AcmeSystemName' 
     AND PVALUE = 'MyRuleGroup' 
    UNION 
    SELECT DISTINCT 
    P2.ARTIFACTTYPE, 
    P2.ARTIFACTTNS, 
    P2.ARTIFACTNAME 
    FROM {PROPERTIES_TABLE_NAME} P2 
    WHERE PNAME = 'AcmeSystemDisplayName' 
     AND PVALUE = 'MyRuleGroup') A, 
(SELECT DISTINCT 
    P3.ARTIFACTTYPE, 
    P3.ARTIFACTTNS, 
    P3.ARTIFACTNAME 
FROM {PROPERTIES_TABLE_NAME} P3 
WHERE PNAME = 'AcmeSystemTargetNameSpace' 
    AND PVALUE = 'http://mymodule') B 
WHERE A.ARTIFACTTYPE = B.ARTIFACTTYPE 
    AND A.ARTIFACTTNS = B.ARTIFACTTNS 
    AND A.ARTIFACTNAME = B.ARTIFACTNAME 
+0

Sie verwendeten Aliasnamen, wo das OP nicht - deshalb ist es in Ihrer Version korrekt - Sie haben das Problem tatsächlich behoben. –

+0

Sean: Die Abfrage, die ich oben geschrieben habe, ist mein Vorschlag an das OP, wie man sein Problem löst. Es ist nicht das, was ich in meiner Datenbank ausgeführt habe. Zwei getrennte Gedanken. –

+0

Ein konkretes Beispiel hinzugefügt, das zeigt, dass ich die EXACT-Abfrage des OP in Oracle ausführen kann, ohne einen Mehrdeutigkeitsfehler zu erhalten. –

1

Sind Sie die komplette Abfrage? Vielleicht haben Sie auch ORDER BY-Klausel - das dass Problem

verursachen könnte ich unterstützen würde Dave on that that sollte

0

Sie müssen angeben, die Tabellen in der ORDER BY Klausel, wie dies kein Problem mit der gebuchten Abfrage sein:

ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME