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

Вы можете сделать это

Types::select('*')
         ->get()
         ->groupBy(DB::raw('type'));
.
8
задан Paul Reiners 9 January 2009 в 18:34
поделиться

5 ответов

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

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

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

24
ответ дан 5 December 2019 в 06:10
поделиться

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

0
ответ дан 5 December 2019 в 06:10
поделиться

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

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

1
ответ дан 5 December 2019 в 06:10
поделиться

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

ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME
0
ответ дан 5 December 2019 в 06:10
поделиться

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

Я записал то, что я думаю, эквивалентный запрос и выполнил его в моей базе данных (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
  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
2
ответ дан 5 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: