Вы можете сделать это
Types::select('*')
->get()
->groupBy(DB::raw('type'));
. Поскольку ARTIFACTTYPE
может относиться к также A.ARTIFACTTYPE
или B.ARTIFACTTYPE
и сервер должен знать, на какой Вы хотите, просто изменяете его A.ARTIFACTTYPE
и необходимо быть хорошо в этом случае.
Для разъяснения необходимо указать префикс псевдонима любое время, имя столбца неоднозначно. Это не плохая практика, чтобы всегда использовать префиксы псевдонима, поскольку это проясняет, какие столбцы появляются, из которых, таблиц когда Вы читаете запрос, и устраняет проблемы как этот.
Можно было бы задаться вопросом, почему необходимо различать, между каким из двух столбцов Вы хотите, когда они оба обращаются к тому же столбцу в той же таблице. Ответ - то, что, когда Вы соединяете таблицу с собой, значения от A.column и B.column могут отличаться в зависимости от критериев соединения (тех, которые могут иметь место с внешним объединением, где значения в одном из столбцов могут быть нулевыми).
Чтобы быть ясным, это - строки 13, 14 и 15, которые имеют неоднозначные столбцы.
Вы перечисляете полный запрос? Возможно, у Вас есть также пункт ORDER BY - который мог вызвать ту проблему
Я поддерживал бы Dave на том, что не должно быть никакой проблемы с отправленным запросом
Необходимо указать таблицы в ORDER BY
пункт, как это:
ORDER BY A.ARTIFACTTYPE, A.ARTIFACTTNS, A.ARTIFACTNAME
Если бы это - точный запрос, Вы работаете, я понятия не имею, почему он нашел бы что-либо неоднозначным.
Я записал то, что я думаю, эквивалентный запрос и выполнил его в моей базе данных (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