Текущий архив: 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.47 MB
Время: 0.007 c