При выполнении следующего (полного) 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'.
Что я здесь делаю не так и как это исправить?
Кроме того, похоже, что вы создали «Единую истинную таблицу поиска» - грубая ошибка при проектировании моделирования данных, настолько распространенная, что у нее есть собственное название. Хотя я мог ошибаться, узор выглядит О! так знакомо. Погуглите этот термин.


Поскольку ARTIFACTTYPE может относиться либо к A.ARTIFACTTYPE, либо к B.ARTIFACTTYPE, и серверу необходимо знать, какой из них вы хотите, просто измените его на A.ARTIFACTTYPE, и в этом случае все будет в порядке.
Чтобы уточнить, вам нужно указывать префикс псевдонима каждый раз, когда имя столбца неоднозначно. Всегда использовать префиксы псевдонимов - неплохая практика, поскольку это дает понять, какие столбцы из каких таблиц поступают при чтении запроса, и устраняет проблемы, подобные этой.
Может возникнуть вопрос, почему вам нужно различать, какой из двух столбцов вам нужен, если они оба относятся к одному и тому же столбцу в одной таблице. Ответ заключается в том, что когда вы присоединяете таблицу к самой себе, значения из A.column и B.column могут отличаться в зависимости от критериев соединения (например, в случае внешнего соединения, где значения в одном из столбцов могут быть нулевой).
Потому что, согласно моему собственному ответу ниже, я не понимаю, почему что-то в этом запросе неоднозначно. В частности, я не вижу неквалифицированного ARTIFACTTYPE, в котором добавление A или B имело бы смысл. Ваше объяснение того, что означает двусмысленность, прекрасно, но я подозреваю, что ОП все это понимает.
Спасибо, Дэйв, после более внимательного просмотра запроса не оказалось, что есть какая-либо двусмысленность, хотя я использовал базы данных, которые очень разборчивы в применении псевдонимов, SQL Server может быть одним из них. В любом случае, независимо от отправленного запроса, мой ответ явно касается указанной ошибки.
Привет, Роберт, я попробовал ваше предложение, но теперь столкнулся с другой ошибкой. Не могли бы вы еще раз взглянуть на мой обновленный вопрос? Павел
Чтобы было ясно, это строки 13, 14 и 15, которые имеют неоднозначные столбцы.
Почему? Почему эти строки должны быть неоднозначными, а строки 5, 6 и 7 - нет?
Сначала я думал то же самое, но, посмотрев внимательнее на код, я поддержал бы Дэйва в этом
Не уверен, почему эти строки неоднозначны. Просто рассказываю вам, что говорит студия MGMT. Сервер базы данных 8-летней давности может иметь какое-то отношение к этому. Я так понимаю, вы, ребята, пробовали это на sql server 2000, как указано на исходном плакате. Спасибо за голоса против, даже не пробуя его на sql 2000.
Я попробовал ваше предложение, но теперь столкнулся с другой ошибкой. Не могли бы вы еще раз взглянуть на мой обновленный вопрос? Павел
Если это именно тот запрос, который вы выполняете, я понятия не имею, почему он может найти что-то двусмысленное.
Я написал то, что считаю эквивалентным запросом, и без проблем запустил его в своей базе данных (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 не использовались - поэтому это правильно в вашей версии - вы фактически устранили проблему.
Шон: Запрос, который я написал выше, - это мое предложение ОП о том, как обойти его проблему. Это не то, что я использовал в своей базе данных. Две отдельные мысли.
Добавлен конкретный пример, показывающий, что я могу выполнить ТОЧНЫЙ запрос OP в Oracle, не получая ошибки двусмысленности.
Вы перечисляете полный запрос? Возможно, у вас также есть предложение ORDER BY - это может вызвать эту проблему.
Я бы поддержал Дэйв об этом, проблем с опубликованным запросом быть не должно
Вам необходимо указать таблицы в предложении ORDER BY, например:
ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME
Вы можете избавиться от каждого отдельного в своем запросе.