Надо сделать денормализацию

Владимир Саныч
Дата: 22.11.2009 16:33:31
Мое почтение всем и благодарность авансом.

Была таблица, в которой 20 раз повторялась одна группа из 5 полей. Я произвел нормализацию, теперь этих полей нет, зато есть вторая таблица с 5 полями плюс ключ для привязки к первой. А теперь клиент хочет запрос, который бы показывал всё как было. То есть все поля из первой таблицы (для простоты допустим, что только для одной записи) и сколько раз есть группы по 5 полей из второй - и всё в одну строчку. Неужели теперь надо делать 5 перекрестных запросов, а потом соединять их в динамическом селекте, который строится циклом? Или есть более простое средство?
Rivkin Dmitry
Дата: 22.11.2009 16:46:30
Саныч, енсли не лень и не трудно, приведи структуру или картинку того, что было, и то, что стало. Написано, вроде, у тебя понятно, но мне кажется, есть разночтения.

ЗЫ
Может быть в тему:
Воспользоваться или еще одной таблой со счетчиком от 1 до 5 или динамически создать ее в запросе
select 1 as N
union
select 2
...
select 5
и уже ее джоинить к основным таблицам
Shadow Of Sun
Дата: 22.11.2009 16:51:46
Владимир Саныч,

А что тебе мешает связать в конструкторе главную с подчиненной
и добавить эти поля

в смысле добавить 5 полей, потом еще раз 5 полей (сменив названия) и так 20 раз

геморно, но просто
Shadow Of Sun
Дата: 22.11.2009 16:54:35
Shadow Of Sun,

Как вариант сделать функцию, создающую этот демонический запрос
Владимир Саныч
Дата: 22.11.2009 17:08:11
Shadow Of Sun
Как вариант сделать функцию, создающую этот демонический запрос

Это я могу, но только как крайний случай.

У нас ведь тут в форуме все время, когда кто-то приводит неправильную структуру данных, ему говорят: делай правильно, а неправильно всегда сможешь получить запросом. Вот я и хочу запросом. Причем задачка-то вроде не сильно заковыристая.

Shadow Of Sun
А что тебе мешает связать в конструкторе главную с подчиненной
и добавить эти поля

в смысле добавить 5 полей, потом еще раз 5 полей (сменив названия) и так 20 раз

А как выцеплять из 20 записей первую, вторую и т.д.? Допустим, первую через First (хотя на самом деле и это неправильно), а дальше как?

Rivkin Dmitry
Воспользоваться или еще одной таблой со счетчиком от 1 до 5 или динамически создать ее в запросе
select 1 as N
union
select 2
...
select 5
и уже ее джоинить к основным таблицам

И чем она мне поможет?

Rivkin Dmitry
Саныч, енсли не лень и не трудно, приведи структуру или картинку того, что было, и то, что стало. Написано, вроде, у тебя понятно, но мне кажется, есть разночтения.

Было:
A B C D E P1 Q1 R1 S1 T1 P2 Q2 R2 S2 T2 P3 Q3 R3 S3 T3 ... P20 Q20 R20 S20 T20

Стало:
Первая таблица: A B C D E
Вторая таблица: A Z P Q R S T (несколько записей на каждую запись первой таблицы)
где:
A - поле, служащее для привязки одной таблицы к другой
Z - просто счетчик, сделанный для уникальности ключа

Нужен запрос для одного конкретного значения поля A:
A B C D E P1 Q1 R1 S1 T1 P2 Q2 R2 S2 T2 P3 Q3 R3 S3 T3 ... Pn Qn Rn Sn Tn
где:
n - количество записей в группе с данным значением поля A
Rivkin Dmitry
Дата: 22.11.2009 17:34:43
Похоже, не стоило разделять таблицу...
Поле z должно быть не просто счетчиком, а номером группы. Т.е. поле А апределяет строку записи,а z - номер группы в этой записи. Иначе очень трудно из второй таблицы выделить какая строка какую группу в каждой строчке определяет. При таком раскладе можно будет собрать запрос: в 5 джоинов

select A, B, C, D, E, P1, Q1, R1, S1, T1, P2, Q2, R2, S2, T2, P3, Q3, R3, S3, T3, ... P20, Q20, R20, S20, T20
from tbl1 as t0
inner join (select A, P as P1, Q as Q1, R as R1, S as S1, T as T1 from tbl2 where z = 1) as t1
on t0.A = t1.A
inner join (select A, P as P2, Q as Q2, R as R2, S as S2, T as T2 from tbl2 where z = 2) as t2
on t0.A = t2.A
...
on t0.A = t5.A
Владимир Саныч
Дата: 22.11.2009 17:37:58
Ну, сделать вычисляемый счетчик, который идет от 1 и подряд, несложно. Это в факах есть. Так что спасибо за идею, попробую реализовать.
Владимир Саныч
Дата: 22.11.2009 17:40:53
Эээ... Только идти этот селект будет не до 5 (потому что 5 - это количество полей в группе), а до 20 (это количество групп). А точнее, до бесконечности, потому что с того момента, как была произведена нормализация, ограничение в 20 исчезло. И эта бесконечность меня смущает. Но ведь в перекрестном запросе всё нормально получается, несмотря на такую же бесконечность: сколько есть записей, столько получается столбцов. Почему в моем случае так нельзя?
Shadow Of Sun
Дата: 22.11.2009 17:45:40
Владимир Саныч,

Я тупишка - не понял вначале смысла запроса

С моей точки зрения проблема возникла из-за того, что ты перенормализовал
Я проверяю нормализацию на удобстве построения запросов.

Для решения твоей проблемы проще способа, чем написать функцию к сожалению не представляю

Можно попробовать через рекордсет
Владимир Саныч
Дата: 22.11.2009 17:53:46
Shadow Of Sun
перенормализовал

Неужели надо было оставить 20 раз повторенную группу полей в одной таблице???