Member 11658469 Ответов: 2

Оракул группа на запрос помочь


Таблица 1
ID    FNAME		MNAME   MOB    SEG
1		A		S		11		11
2		A		D		12		11
3		C		H		13		12

Таблица 2
ID	DATE	NAT	SEG
1	01		KK	11
2	02		KK	11

Мне нужно получить записи с соответствующим сегментом но сгруппировать по сегменту
ВЫХОД:
NAME	MOB	SEG	DATE	NAT
AS		11	11	01		KK


Что я уже пробовал:

SELECT * FROM TABLE1,TABLE2 WHERE TABLE1.SEG=TABLE2.SEG GROUP BY SEG

2 Ответов

Рейтинг:
0

CHill60

Ну что ж первая проблема которую вы получите это

Ambiguous column name 'SEG'.
Поскольку SEG существует как в таблице 1, так и в таблице 2, Вы должны явно указать Oracle, какой из них вы хотите использовать, например
SELECT * FROM TABLE1,TABLE2 WHERE TABLE1.SEG=TABLE2.SEG GROUP BY TABLE1.SEG
Но этот код просто приведет вас к следующей проблеме ...
Column 'TABLE1.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Вы, вероятно, никогда не столкнетесь с ситуацией, когда SELECT * это разумно при использовании с GROUP BY На самом деле гораздо лучше всегда перечислять нужные столбцы явно - это может быть более эффективно, но также останавливает устаревший код от взлома, если в будущем будут внесены изменения в схему таблицы.
Вы также используете очень старомодный способ объединения таблиц - используйте явный JOIN сорта и ON п. вместо например
SELECT FNAME+MNAME, MOB, T1.SEG, [DATE], NAT
FROM TABLE1 T1
INNER JOIN TABLE2 T2 ON T1.SEG = T2.SEG
Этот код даст вам
AS	11	11	1	KK
AD	12	11	1	KK
AS	11	11	2	KK
AD	12	11	2	KK
Следующая часть проблемы - это ваши ожидаемые результаты. Неясно, какую логику вы применяли, чтобы ожидать только этой одной линии результатов. Единственный способ, который я мог видеть, чтобы получить его был
SELECT MAX(FNAME+MNAME), MIN(MOB), T1.SEG, MIN([DATE]), MAX(NAT)
FROM TABLE1 T1
INNER JOIN TABLE2 T2 ON T1.SEG = T2.SEG
GROUP BY T1.SEG
но я почти уверен, что это так. нет то, что ты действительно хочешь.

В качестве отступления вы увидите, что я использовал квадратные скобки вокруг [DATE] Это связано с тем, что дата является зарезервированным словом и не должна использоваться для имен столбцов, если она не заключена в [ ]


Maciej Los

5ed!

Wendelius

Хорошо объяснил! 5 от меня.

Рейтинг:
0

Maciej Los

Попробовать это:

SELECT t1.FNAME + t1.MNAME, t1.MOB, t1.SEG, t2.DAT, t2.NAT
FROM TABLE1 AS t1
    INNER JOIN TABLE2 AS t2 ON t1.SEG = t2.SEG
ORDER BY t1.ID


Выход:
NAME	MOB	SEG	DATE	NAT
AS		11	11	01		KK
AS		11	11	02		KK
AD		12	11	01		KK
AD		12	11	02		KK


Для получения более подробной информации, пожалуйста, смотрите: Визуальное представление SQL-соединений[^]