Ошибка неоднозначного имени столбца

При выполнении следующего (полного) 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'.

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

Вы можете избавиться от каждого отдельного в своем запросе.

Mark Brady 25.11.2008 21:43

Кроме того, похоже, что вы создали «Единую истинную таблицу поиска» - грубая ошибка при проектировании моделирования данных, настолько распространенная, что у нее есть собственное название. Хотя я мог ошибаться, узор выглядит О! так знакомо. Погуглите этот термин.

Mark Brady 25.11.2008 22:01
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
9
2
50 254
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

Потому что, согласно моему собственному ответу ниже, я не понимаю, почему что-то в этом запросе неоднозначно. В частности, я не вижу неквалифицированного ARTIFACTTYPE, в котором добавление A или B имело бы смысл. Ваше объяснение того, что означает двусмысленность, прекрасно, но я подозреваю, что ОП все это понимает.

Dave Costa 26.11.2008 16:31

Спасибо, Дэйв, после более внимательного просмотра запроса не оказалось, что есть какая-либо двусмысленность, хотя я использовал базы данных, которые очень разборчивы в применении псевдонимов, SQL Server может быть одним из них. В любом случае, независимо от отправленного запроса, мой ответ явно касается указанной ошибки.

Robert Gamble 26.11.2008 19:24

Привет, Роберт, я попробовал ваше предложение, но теперь столкнулся с другой ошибкой. Не могли бы вы еще раз взглянуть на мой обновленный вопрос? Павел

Paul Reiners 10.12.2008 22:34

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

Почему? Почему эти строки должны быть неоднозначными, а строки 5, 6 и 7 - нет?

Dave Costa 25.11.2008 20:49

Сначала я думал то же самое, но, посмотрев внимательнее на код, я поддержал бы Дэйва в этом

kristof 25.11.2008 21:19

Не уверен, почему эти строки неоднозначны. Просто рассказываю вам, что говорит студия MGMT. Сервер базы данных 8-летней давности может иметь какое-то отношение к этому. Я так понимаю, вы, ребята, пробовали это на sql server 2000, как указано на исходном плакате. Спасибо за голоса против, даже не пробуя его на sql 2000.

Logicalmind 26.11.2008 00:53

Я попробовал ваше предложение, но теперь столкнулся с другой ошибкой. Не могли бы вы еще раз взглянуть на мой обновленный вопрос? Павел

Paul Reiners 10.12.2008 22:35

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

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

РЕДАКТИРОВАТЬ Добавление точного вывода нового эксперимента в Oracle. Запрос, выполняемый в этом эксперименте, является точным запросом, заданным OP, с заполненным именем таблицы. НИКАКИХ ДРУГИХ ИЗМЕНЕНИЙ. В этом запросе нет ничего двусмысленного. Итак, либо это не тот запрос, который выполняется, либо в 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

Конец редактирования

Мое предложение обойти ошибку - дать таблице в каждом предложении select уникальный псевдоним и указать все ссылки на столбцы. Нравится:

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

Вы использовали псевдонимы там, где OP не использовались - поэтому это правильно в вашей версии - вы фактически устранили проблему.

Sean Carpenter 25.11.2008 21:00

Шон: Запрос, который я написал выше, - это мое предложение ОП о том, как обойти его проблему. Это не то, что я использовал в своей базе данных. Две отдельные мысли.

Dave Costa 25.11.2008 23:46

Добавлен конкретный пример, показывающий, что я могу выполнить ТОЧНЫЙ запрос OP в Oracle, не получая ошибки двусмысленности.

Dave Costa 25.11.2008 23:56

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

Я бы поддержал Дэйв об этом, проблем с опубликованным запросом быть не должно

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

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

Другие вопросы по теме