2008-11-25 6 views
8

При выполнении следующего (полный) SQL запроса на Microsoft SQL Server 2000:Неоднозначного имя столбца ошибка

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 

я получаю следующее исключение:

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

Что я делаю неправильно здесь и как я могу это исправить?

+0

Вы можете избавиться от каждого конкретного в своем запросе. – 2008-11-25 18:43:21

+0

Кроме того, похоже, что вы создали «One True Lookup Table», дизайн моделирования данных, который так распространен, имеет свое имя. Хотя я мог ошибаться, картина выглядит Oh! так знакомы. Google этот термин. – 2008-11-25 19:01:33

ответ

24

Поскольку ARTIFACTTYPE может относиться либо A.ARTIFACTTYPE или B.ARTIFACTTYPE и сервер должен знать, что вы хотите, просто изменить его A.ARTIFACTTYPE и вы должны быть хорошо в этом случае.

Чтобы уточнить, вам нужно указать префикс псевдонима в любое время, когда имя столбца неоднозначно. Неплохая практика всегда использует префиксы псевдонимов, поскольку она дает понять, какие столбцы приходят из таблиц при чтении запроса, и устраняет такие проблемы, как эта.

Можно задаться вопросом, почему вам нужно различать, какой из двух столбцов вам нужен, когда они оба относятся к одному и тому же столбцу в одной таблице. Ответ заключается в том, что когда вы присоединяетесь к таблице для себя, значения из A.column и B.column могут отличаться в зависимости от критериев соединения (например, это может быть случай с внешним соединением, где значения в одном из столбцов могут быть ноль).

+0

За что голосовать? – 2008-11-25 21:04:46

+0

Потому что, согласно моему собственному ответу ниже, я не понимаю, почему что-либо в этом запросе неоднозначно. В частности, я не вижу никакого безусловного ARTIFACTTYPE, где добавление A или B имеет смысл. Ваше объяснение того, что означает двусмысленность, просто замечательно, но я подозреваю, что OP все это понимает. – 2008-11-26 13:31:33

0

Чтобы быть ясным, это строки 13, 14 и 15, которые имеют неоднозначные столбцы.

2

Если это точный запрос, который вы используете, я понятия не имею, почему он найдет что-то двусмысленное.

Я написал, что я думаю, является эквивалентным запросом и без проблем запускал его в моей базе данных (Oracle).

EDIT Добавление точного результата нового эксперимента в Oracle. Запрос, выполненный в этом эксперименте, представляет собой точный запрос, заданный OP, с заполненным именем таблицы. NO OTHER CHANGES. В этом запросе нет ничего неопределенного. Таким образом, это не точный запрос, который выполняется, либо SQL Server имеет ошибку парсера.

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 

End Edit

Мое предложение для получения вокруг ошибки, чтобы дать таблицу в каждом выбранном пункте уникальный псевдоним и право всех ссылок на столбцы. Пример:

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 
1

Вы представляете полный запрос? Возможно, у вас есть также предложения ORDER BY - это может вызвать эту проблему

Я бы поддержать Dave on that that не должно быть никаких проблем с отправленного запроса

0

Вы должны указать, какие таблицы в предложении ORDER BY, как это:

ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME 
Смежные вопросы