Главная страница
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.021 c
7-31526
onezero
2003-04-27 14:21
2003.07.10
Как изменить системное время программно? Помогите!!!


14-31426
megadeth
2003-06-20 18:38
2003.07.10
Как windoze отлавливает время когда надо запустить screensaver ?


1-31214
Новенький
2003-06-28 17:45
2003.07.10
Опять про файл


11-31170
IZVER
2002-11-03 15:09
2003.07.10
News-server KOL


7-31543
Lamo
2003-04-26 15:50
2003.07.10
Клавиатура пикает...