Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
В общем то вот такая необходимость образовалась... Есть таблица товаров: CREATE TABLE Item (ID INT PRIMARY KEY, Name varchar(50) NOT NULL) INSERT INTO Item VALUES(1,'Товар1') INSERT INTO Item VALUES(2,'Товар2') Есть таблица возможных упаковок товара (каждый товар может приходить в разных упаковках) по 6 шт, по 12 шт и т.д. CREATE TABLE ItemBox (ID_ITEM INT NOT NULL, InBox varchar(50) NOT NULL) INSERT INTO ItemBox VALUES(1,6) INSERT INTO ItemBox VALUES(1,12) INSERT INTO ItemBox VALUES(2,10) INSERT INTO ItemBox VALUES(2,18 ) INSERT INTO ItemBox VALUES(2,24) Как методами SQL получить в итоге: Товар DSK Товар1 6,12 Товар2 10,18,24 В Access-SQL в принципе возможно например с пом. Update Query в пустое поле временной таблицы эту информацию собрать, а вот как в T-SQL что то никак непридумаю 2Moderater: кстати, почему NickName из 2х символов зажали? С уважением, Андрей Митин ICQ 38607432 http://am.rusimport.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 07:40 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
> 2Moderater: кстати, почему NickName из 2х символов зажали? У нас с этим связаны плохие воспоминания... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 07:56 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
create function Fun(@ID as integer) returns varchar(8000) as begin declare @Fun varchar(8000) set @Fun = '' select @Fun = @Fun + InBox + ' ' from ItemBox where ItemBox.ID_Item = @ID return @Fun end select Name, dbo.Fun(ID) from Item ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 08:15 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
Здравствуй, Андрей! Рад старым MAUG-овцам. Похоже, киты MAUG постепенно перекочевывают сюда. Здесь же Павел с Кузбаса кантуется (ему тоже привет). А по сути хотелось бы узнать версию SQL-сервера. Дед Маздай привел вариант для SQL2K. А для 7.0 это делается с помощью SP (если не совру, ранее на аналогичную тему предлагал решение на этом форуме SergSuper). Кстати, я решаю аналогичную задачу (речь идет о масштабируемости единиц измерений), можем по мылу обсудить. Давно над ней медитирую... Если что, пиши hydro@corbina.ru. Андрей Гордиенко ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 08:43 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
2Дед Маздай Извиняюсь, что не сказал сразу. SQL Server 7.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 08:46 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
4Garya:Привет, Андрей! Рад что узнал! Кстати случайно тут увидел внизу твоё сообщение (как всегда развернутое и интересное про рекурсивные процедуры. Там ты как раз упомянул красным словцом однопроходный UPDATE в SQL Server. Здесь кстати такая же история В Access запрос типа UPDATE ItemTMP INNER JOIN ItemBox ON ItemTMP.Item = ItemBox.ID_T SET ItemTMP.DSK = ItemTMP.DSK+"," & [ItemBox].[InBox]; как раз обновит поле DSK в ItemTMP до значения типа "6,12" (для товара 1 из моего примера). Я наивный тоже хотел в SQL сделать - заполняет только 6 да, SQL Server как я уже сказал 2ДедМаздай - 7.0 А по поводу масшатабируемости единиц измерения (ЕИ)... Насколько я помню в MAUG ты как то очень подробно объяснял принципы учета в различных ЕИ в системах... Я думал здесь тебе всё предельно ясно Или опять что то хитрое придумал? С уважением, Андрей Митин ICQ 38607432 http://am.rusimport.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 09:09 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
Создаёшь курсор - объединение Item и ItmBox по ID -> Item_id : 1 6 1 12 2 10 2 18 2 24 И времянку Item_ID (int) InBoxes (varchar(256) Бежишь по курсору, накапливаешь строчку, при смене Item_ID -скидываешь во времянку. Читаешь всё из времянки. Код писать лень... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 15:38 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
Вариант 1 на курсорах: -------------------------------------------------- declare @LongString varchar(200) declare @CurName varchar(50) declare @ID int declare Curs CURSOR FOR SELECT * FROM Item OPEN Curs create table #TempTable (Name varchar(50), LongString varchar(200)) FETCH NEXT FROM Curs into @ID, @CurName while @@FETCH_STATUS = 0 begin set @LongString='' select @LongString=@LongString+InBox+', ' from ItemBox where ID_ITEM=@ID insert into #TempTable (Name, LongString) values (@CurName, @LongString) FETCH NEXT FROM Curs into @ID, @CurName end close Curs deallocate Curs select * from #TempTable ----------------------------------------- Вариант 2 без курсоров. Правда, чтобы он корректно работал, нужно добавить в таблицу ItemBox еще одно поле LongString varchar(200) и создать по этой таблице кластерный индекс по полям ID_Item и InBox. Этот вариант грешит своими недостатками. Кроме того, он нуждается в доработке, поскольку в конце каждой строки лишняя запятая, но это ведь дело поправимое (главное идея): ----------------------------------------- declare @LongString varchar(200) declare @previouseID_Item int set @previouseID_Item=0 update ItemBox set @LongString=LongString=(case when @previouseID_Item=ID_Item then @LongString+cast(InBox as varchar(10))+',' else cast(InBox as varchar(10))+',' end), @previouseID_Item=ID_Item from ItemBox select I.[Name],B.MLongString from item I, (select top 100 percent max([ID_Item]) as [ID], max(cast(InBox as int)) as MInBox , max(LongString) as MLongString from ItemBox group by Id_Item) B where I.[ID]=B.[ID] --------------------------------------------------- >А по поводу масшатабируемости единиц измерения (ЕИ)... Насколько я помню в MAUG ты как то очень подробно объяснял принципы учета в различных ЕИ в системах... И правда, было такое. Забыл уже . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 18:22 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
2Garya Как по мне - лажа >select @LongString=@LongString+InBox+', ' from ItemBox where >ID_ITEM=@ID Тут ругнётся - у тебя возвращается больше, чем одна запись... Я ж говорю: >Создаёшь курсор - ОБЪЕДИНЕНИЕ Item и ItmBox по ID -> Item_id : Код писать всё ещё лень... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2001, 10:52 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
2Wild_V Вполне работоспособный вариант: --vvvvvvvvvvvvvvvvvvvvvv declare @LongString varchar(200) --declare @CurName varchar(50) declare @ID int declare Curs CURSOR FOR SELECT Item FROM ItemBox GROUP BY Item OPEN Curs FETCH NEXT FROM Curs into @ID while @@FETCH_STATUS = 0 begin SET @LongString='' SELECT @LongString=CASE WHEN @LongString='' THEN '' ELSE @LongString+',' END + rtrim(cast(InBox as varchar(10))) FROM ItemBox WHERE ITEM=@ID --UPDATE #tmp SET DSK= @LongString WHERE ITEM=@ID INSERT INTO #tmp (ITEM,DSK) VALUES (@ID, @LongString) FETCH NEXT FROM Curs into @ID end close Curs deallocate Curs --^^^^^^^^^^^^^^^^^^^ Всем большое спасибо... Да и внизу (ну оччень далеко ) нашел подобные вопросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2001, 13:37 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
2 Wild_V. Не знаю, о какой лаже вы говорите. Я запустил этот код полминуты назад: declare @ttt varchar(4000) set @ttt='' select @ttt=@ttt+[Name]+',' from syscolumns select @ttt Все работает! Правда, у меня SQL2K. Может, у вас какая-то старая версия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2001, 11:09 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
2 am. Вариант 1 я не тестировал. А вот вариант 2 для меня показался более интересным. Его я протестировал перед тем как класть в постинг - точно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2001, 11:12 |
|
||
|
хитрый (ну может быть не особо :) запрос
|
|||
|---|---|---|---|
|
#18+
2Garya Привет, Андрей. Да, второй вариант интересный, но он подразумевает хранение ещё одного поля и несмотря на это использование хранимой процедуры для его заполнения и выборки... Вообще то в моем случае мне проще всего сделать доп. текстовое поле в основной табл (Item) и поддерживать его актуальность на триггерах при изменении второй таблицы... Жаль вот только у mdb триггеров нет ) База работает в 2х вариантах, так что придется не в SQL версии поддерживать такую актуальность на клиенте... Ещё раз большое спасибо за обсуждение. С уважением, Андрей Митин ICQ 38607432 http://am.rusimport.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2001, 11:29 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32007906&tid=1826401]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 367ms |

| 0 / 0 |
