Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.10;
Скачать: CL | DM;

Вниз

Конструирование SQL-запроса   Найти похожие ветки 

 
Юрий БК   (2003-06-11 05:17) [0]

Имеется Paradox-таблица такого формата:

VidDoc: String[4],
DocNo : String[12],
S : Double,
Owner : Integer,
Child : Integer и куча других полей.

Записи в таблице образуют группы, связаные в линейный список посредством полей Owner и Child
Количество записей в списке может быть разным (1..5)
Значения в поле VidDoc в группе не совпадают, а номера документов (поле DocNo) - подобны,
т.е., если головная запись в группе имеет номер РТН-20, все остальные записи будут иметь
номера вида РТН-20.1, РТН-20.2 и т.д.

Вопрос - можно ли сформировать SQL-запрос для получения выборки следующего вида (версия для BDE):

VidDoc, DocNo, S1, S2, S3.. Sn, где

VidDoc, DocNo, S1 - значения соответствующих полей головной записи (VidDoc = "РТН")
S2,S3..Sn - поля S, соответственно второй, третьей и т.д. записи списка


 
Wowa-K ©   (2003-06-11 05:59) [1]

А between не помогает


 
ЮЮ ©   (2003-06-11 06:01) [2]

SELECT
main.VidDoc, main.DocNo, main.S S1, d1.S S1, d2.S S2, ... d5.S S5
FROM
Table main
LEFT JOIN Table d1 ON (main.ID = d1.Owner) AND (<поле-номер> = 1)
...
LEFT JOIN Table d5 ON (main.ID = d5.Owner) AND (<поле-номер> = 5)
WHERE main.VidDoc = "РТН"


 
ЮЮ ©   (2003-06-11 06:06) [3]

>связаные в линейный список посредством полей Owner и Child
поподробней можно? Или на примере


 
Юрий БК   (2003-06-12 05:30) [4]

Пояснение к вопросу - пример списка записей

ID VidDoc DocNo S Owner Child
1 РТН РТН-10 100 0 2
2 НЛГ РТН-10.1 20 1 3
3 НЛГ РТН-10.2 4 2 0
остальные записи в том же духе, т.е. Owner головной записи = 0
и Child последней записи = 0
Необходимо выбрать (в одну строку!) S из всех записей списка
Следующая строка - документ РТН-11 и т.д.
Спасибо.


 
Юрий БК   (2003-06-12 07:18) [5]

Дополнение 2

Запрос вида
SELECT
A1.VidDoc, A1.DocNo, A1.LSum S0, d1.LSum S1, d2.LSum S2, d3.LSum S3
FROM
Accounts A1
LEFT JOIN Accounts d1 ON (A1.ItemNo = d1.Owner)
LEFT JOIN Accounts d2 ON (A1.ItemNo = d2.Owner)
LEFT JOIN Accounts d3 ON (A1.ItemNo = d3.Owner)
WHERE A1.VidDoc = "РТН"

работает, но выдает ВСЕ возможные комбинации для полей S0,S1,S2,S3, всего 27 строк для каждого DocNo. Правильным (и необходимым) является только одна строка. Как отсеять все лишние? Distinct убирает ВСЕ строки (пустая выборка)
Спасибо


 
Соловьев ©   (2003-06-12 10:08) [6]


> Вопрос - можно ли сформировать SQL-запрос для получения
> выборки следующего вида (версия для BDE):
>
> VidDoc, DocNo, S1, S2, S3.. Sn, где
>
> VidDoc, DocNo, S1 - значения соответствующих полей головной
> записи (VidDoc = "РТН")
> S2,S3..Sn - поля S, соответственно второй, третьей и т.д.
> записи списка

нельзя это сделать на LocalSQL.


 
ЮЮ ©   (2003-06-16 04:42) [7]

>Соловьев © (12.06.03 10:08)
>нельзя это сделать на LocalSQL.

В общем случае, конечно нельзя, но когда "Количество записей в списке может быть разным (1..5)", почему нет ???

SELECT
A1.VidDoc, A1.DocNo, A1.LSum S0, d1.LSum S1, d2.LSum S2, d3.LSum S3
FROM
Accounts A1
LEFT JOIN Accounts d1 ON (d1.ID = A1.Child)
LEFT JOIN Accounts d2 ON (d2.ID = d1.Child)
LEFT JOIN Accounts d3 ON (d3.ID = d2.Child)
WHERE A1.VidDoc = "РТН"

Р.S. На мой взгляд, Owner - лишнее поле, т.к. вставка/удаление записи в табдицу требует корректировки и последующей и предыдущей записи. Связи ID <-> Child вполне для организации связного списка.


 
ЮЮ ©   (2003-06-17 03:17) [8]

Автор вопроса, очевидно поверил Соловьев © (12.06.03 10:08) :-(
На всякий случай, исправлюсь по части P.S. Я имел в виду, что для линейного списка достаточно связки ID - PriorID (т.е. в твоем случае Owner, а не Child, как я сказал ранее)


 
Соловьев ©   (2003-06-17 09:43) [9]


> ЮЮ © (17.06.03 03:17)

насколько я понимаю, требуется получить в одну(!!!) строчку S1,...,SN за ранее не известно сколько будет там N. Это сделать только на Local SQL нельзя, можно сделать это на SQL, но с помощью ХП.


 
ЮЮ ©   (2003-06-17 09:58) [10]

Юрий БК (11.06.03 05:17)
"Количество записей в списке может быть разным (1..5):


 
Соловьев ©   (2003-06-17 10:08) [11]


> Количество записей в списке может быть разным

если автора устраивает NULL в строках, то ЮЮ прав, можно и на Local SQL


 
MsGuns ©   (2003-06-17 13:21) [12]

Похлже, что и заголовки накладных (или чего там имеется в виду под "документами") и фактуру ввалили в одну таблицу или я не прав ? Если прав, то надо не искать способ как заставить стоять одноногий табурет, а быстренько приделывать ему остальные 3 или хотя бы 2 ноги (в смысле нормально спроектировать БД) ;)))



Страницы: 1 вся ветка

Текущий архив: 2003.07.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
1-31250
ViJen
2003-06-26 10:55
2003.07.10
Округление


1-31255
Anonimus
2003-06-28 16:47
2003.07.10
SizeOf PChar


9-31064
Кен
2003-01-24 02:20
2003.07.10
GLScene Какие есть редакторы для создания, редактирования, конвер


14-31485
VEG
2003-06-24 13:40
2003.07.10
Папки в BC++


3-31072
bSava
2003-06-11 15:39
2003.07.10
Как после Refresh попасть на ту запись которая была активна.