SQL Sort / Paging question Вопрос - PullRequest
       8

SQL Sort / Paging question Вопрос

0 голосов
/ 06 августа 2011

Допустим, у меня есть сводный отсортированный набор данных, подобный этому

ID    Col1    Col2
1     a       11
2     b       22
3     c       33
4     d       44
5     e       55

Когда я выполняю пейджинговый вызов, возвращая две записи за раз, я получаю первые две строки.

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

ID    Col     Val
1     Col1    a 
2     Col1    b
3     Col1    c
4     Col1    d
5     Col1    e
1     Col2    11
2     Col2    22 
3     Col2    33
4     Col2    44 
5     Col2    55

Я хотел бы написать SQL-оператор, который бы возвращал те же данные, что и в первом примере, но без поворотасначала данные.

Некоторые дополнительные проблемы

1) Может быть n столбцов, а не только два

2) Tt также должен поддерживать фильтр для всех столбцов.Эту часть, которую я решил, см. Ниже

Filter on pivoted data
WHERE Col1 in ('a', 'b', 'c')
AND Col2 in ('11', '22')

Filter on unpivoted data
WHERE (Col = 'Col1' and Val in ('a', 'b', 'c')) or Col != 'Col1') 
AND (Col = 'Col2' and Val in ('11', '22')) or Col != 'Col2') 

Both filters return the same results.

Часть фильтра, которую я уже выяснил, застрял на сортировке и подкачке.

1 Ответ

1 голос
/ 06 августа 2011

SQL, как стандарт, не поддерживает такие операции.Если вы хотите, чтобы он обрабатывал произвольное количество столбцов для переформатирования данных, используйте что-то вроде интерфейса Perl DBI, который может сообщать вам имена столбцов для любой таблицы.Оттуда вы можете сгенерировать вашу таблицу create.

Чтобы создать вторую таблицу, вставка примет форму:

INSERT INTO newtable (id, col, val)
SELECT id, 'Col1', Col1 from oldtable
UNION
SELECT id, 'Col2', Col2 from oldtable;

Просто создайте дополнительные UNION SELECT... для каждого столбца, который вы хотите включить.

Что касается фильтра, запрос делает его излишне сложным.Ваш запрос:

SELECT * FROM newtable
WHERE (Col = 'Col1' and Val in ('a', 'b', 'c')) or Col != 'Col1') 
AND (Col = 'Col2' and Val in ('11', '22')) or Col != 'Col2') 

Может быть переписан как

SELECT * from newtable
WHERE ( Col = 'Col1' and Val in ('a','b','c') )
   OR ( Col = 'Col2' and Val in ('11','22')   )

Каждое отдельное предложение OR d не мешает другим.

Я также не могуНе понимаю, почему люди пытаются работать с такими пародиями в SQL.Похоже, вы пытаетесь превратить разумную схему в нечто похожее на хранилище ключей / значений.Что в настоящее время может быть в моде у детей в наше время, но вы должны действительно научиться использовать всю мощь SQL с хорошим моделированием данных.

...