отдельные значения из нескольких полей в одной таблице ORACLE SQL - PullRequest
2 голосов
/ 22 июля 2011

Как получить разные значения из нескольких полей в одной таблице одним запросом.

Вариант 1

SELECT WM_CONCAT(DISTINCT(FIELD1)) FIELD1S,WM_CONCAT(DISTINCT(FIELD2)) FIELD2S,..FIELD10S
  FROM TABLE;

WM_CONCAT LIMITED

Вариант 2

select DISTINCT(FIELD1) FIELDVALUE, 'FIELD1' FIELDNAME
       FROM TABLE
UNION
select DISTINCT(FIELD2) FIELDVALUE, 'FIELD2' FIELDNAME
       FROM TABLE
... FIELD 10

слишком медленно

Ответы [ 5 ]

2 голосов
/ 02 ноября 2012

Для моей проблемы у меня было

WL1   ...   WL2   ...  correlation
A            B             0.8
B            A             0.8
A            C             0.9
C            A             0.9

как убрать симметрию из этой таблицы?

    select WL1, WL2,correlation from
    table
    where least(WL1,WL2)||greatest(WL1,WL2) = WL1||WL2
    order by WL1

это дает

WL1   ...   WL2   ...  correlation
A            B             0.8
A            C             0.9

:)

1 голос
/ 22 июля 2011

если вы сканировали небольшой диапазон данных (не полное сканирование всей таблицы), вы могли бы использовать WITH для оптимизации вашего запроса например:

WITH a AS 
(SELECT field1,field2,field3..... FROM TABLE WHERE condition)
SELECT field1 FROM a
UNION   
SELECT field2 FROM a
UNION   
SELECT field3 FROM a
.....etc
1 голос
/ 22 июля 2011

Наилучшим вариантом в SQL является UNION, хотя вы можете сэкономить, выбрав ключевые слова distinct:

select FIELD1 FROM TABLE
UNION
select FIELD2 FROM TABLE

UNION предоставляет уникальный набор из двух таблиц, поэтому в этом случае отдельный является избыточным. Просто нет способа написать этот запрос иначе, чтобы он работал быстрее. Там нет волшебной формулы, которая делает поиск более 200 000 строк быстрее. Он должен искать каждую строку таблицы дважды и сортировать по уникальности, что и делает UNION.

Единственный способ сделать это быстрее - это создать отдельные индексы для двух полей (возможно) или сократить набор данных, по которым вы ведете поиск.

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

Кстати, ваш второй запрос, похоже, не выполняет то, что вы хотите. Distinct всегда применяется ко всем столбцам в разделе select, поэтому ваши константы с именами полей будут приводить к тому, что запрос всегда будет возвращать отдельные строки для двух столбцов.


Я придумала другой метод, который экспериментально кажется немного быстрее. В действительности это позволяет нам обменять одно сканирование полной таблицы на декартово объединение. В большинстве случаев я все же решил бы использовать union, поскольку гораздо более очевидно, что делает запрос.

SELECT DISTINCT CASE lvl WHEN 1 THEN field1 ELSE field2 END
FROM              table
       CROSS JOIN (SELECT     LEVEL lvl
                   FROM       DUAL
                   CONNECT BY LEVEL <= 2);

Также стоит добавить, что я протестировал оба запроса в таблице без полезных индексов, содержащих 800 000 строк, и это заняло примерно 45 секунд (возвращая 145 000 строк). Однако большую часть этого времени было потрачено на выборку записей, а не на выполнение запроса (запрос занял 3-7 секунд). Если вы получаете значительное количество строк назад, это может быть просто количество строк, которое вызывает проблему с производительностью, которую вы видите.

0 голосов
/ 22 июля 2011

А как то так?

SELECT 'FIELD1',FIELD1, 'FIELD2',FIELD2,...
FROM TABLE
GROUP BY FIELD1,FIELD2,...
0 голосов
/ 22 июля 2011

Когда вы получаете разные значения из нескольких столбцов, таблица данных не возвращается. Если вы думаете, следующие данные

Column A            Column B<br>
10                  50<br>
30                  50<br>
10                  50<br>

когда вы получите отличное, это будет 2 строки из первого столбца и 1 строка из 2-го столбца. Это просто не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...