Задача по SQL

Usmanova72

есть две таблицы
Table1. Поля ID, Name, Val. ID не по порядку идет, но уникальный. Name- текс с названием допустим инвентарного наименования. Val - количество инвентарного наименования.
Table2. Поля ID, Name. ID просто уникальный счетчик с первой таблицей не связанный, Name Фамилия сотрудника.
УСЛОВИЕ: 1 инвентраный элемент может относиться только к одному сотруднику, на одном сотруднике может висеть несколько элеметов.
Сделать запрос результат которого поля
порядковый номер, инвентарный элемент, пустое поле. НО количество, строчек с инвентарным элементом должно быть равно VAL.
все сделать одним оператором.

pitrik2

условие задачи какое-то размытое
как эти две таблицы связаны друг с другом и вообще зачем нам нужна вторая таблица?
что такое порядковый номер? это id из первой таблицы или просто нумерация от балды?
что такое инвентарный элемент? какое конкретно это поле в какой из таблиц?
что такое оператор? имеется ввиду сделать одним запросом без вложений?

0000

Некорректная задача, т.к. из исходных данных нельзя понять как инвентарный элемент относится к сотруднику.
Или просто требуется произвольно раскидать элементы по сотрудникам? Смысл то ж не понятен - можно отдать все одному.

Usmanova72

таблицы не связаны никак, только односторонним соответствием. ID это нумерация от балды, но уникальная.
Инвентарный элемент например: сканер, монитор, сис. блок и т.д.
оператор да это один запрос со всякими join, селектами и т.д.
ЗЫ, Сказали задача сложная.

pitrik2

порядковый номер, инвентарный элемент, пустое поле. НО количество, строчек с инвентарным элементом должно быть равно VAL.
может тебе такое надо?
есть таблица
id, name, val
нужно выбрать каждую строчку val раз
это вроде не простая задачка, говори какая у тебя субд, я ток на оракле знаю как такое делать

Usmanova72

вся херня в том чтобы сделать кол-во сток одного наименования равное VAL,

pitrik2

односторонним соответствием
блин
что это такое?
нет такого понятия "односторонне соответствие"
есть понятия: такое-то поле в первой таблице соотв. такому-то полю во второй
на половину моих вопросов не ответил
инвертарный элемент - это name в первой таблице или это вообще третья таблица?

Usmanova72

это не взаимно однозначное соответствие.
таблице связаны только логически, как я написал в первом посте.
да инвентарный элемент это name в первой таблице.
В предудущем посте ты правильно понял задачу, но нужно сделать средсвами SQL

pitrik2

нужно сделать средсвами SQL
нет такого понятия "средства sql"
дело в том, что у каждой базы данных свой диалект sql
в оракле например есть connect by и model
с их помощью эта задачка элементарно решается

pitrik2

вот например такой вариант

create table inv (id number, name varchar2(10 val number);
insert into inv values(1,'scanner',5);
insert into inv values(2,'display',3);

WITH nums as
( select rownum num
from ( select 1 num
from dual
group
by cube (1,2,3)
)
)
select inv.*
from inv, nums
where inv.val >= nums.num
order by id

1|scanner|5
1|scanner|5
1|scanner|5
1|scanner|5
1|scanner|5
2|display|3
2|display|3
2|display|3

Papazyan

В ограниченном SQL, думаю, без спец таблицы не обойтись:

show numtbl
x
-
1
2
..
10000

select id,name, hz_chto_dlya pustogo_mesta from tbl1,numtbl where tbl1.vol>=numtbl.x

Что-то типа этого. Не могу проверить точно.
В нормальной базе можно проще:

ungroup select empty:(first vol)#` by id,name from tbl1

pitrik2

УСЛОВИЕ: 1 инвентраный элемент может относиться только к одному сотруднику, на одном сотруднике может висеть несколько элеметов.
все пытаюсь понять эту фразу
если понимать под инвентарным элементом - единицу инвертарного наименования
то получается что запись val=10 означает наличие 10 сотрудников
то есть получается что в таблице сотрудников всегда есть достаточное чсло записей каким бы ни был val
т.е. select max(val) from table1 ВСЕГДА МЕНЬШЕ чем select count(*) from table2
на основе этого можно решить задачу так:

select table1.*
from table1, (select rownum r from table2) i
where i.r <= val
order by id

если бы еще получилось от rownum избавиться, то получиться прям чистый sql :)

pitrik2

В нормальной базе
ой, что это?

sinet

Kdb+ наверное. %)

Papazyan

ой, что это?
kdb+

pitrik2

если бы еще получилось от rownum избавиться, то получиться прям чистый sql :)
получилось

select table1.*
from table1,
( select
(select count(*) from table2 t2 where t2.id <= t1.id) as r
from table2 t1
order by 1
) i
where i.r <= val
order by id

но это работает при условии что инвентарный элемент - это единица инвентарного наименования

Usmanova72

нет ты не понял, инвентарная единица, может записана только на одного челвека, а один человек может владать несколькими инвентарными единицами.

pitrik2

нет ты не понял
какая разница?
лучше скажи
тебе предложили три решения
хоть одно подошло?

Usmanova72

Ща буду изучать. А чо меня минусуют-то? не я же это говно придумывал, просто интересно стало.

0000

> не я же это говно придумывал, просто интересно стало
Ты задачу так сформулировал, что она в говно превратилась.

Usmanova72

как мне написали, так и суда написал

zya369

ты сам-то задачу понял?
если да, то мог бы и сформулировать нормально, а то реально "поди туда не знаю куда" :)

Usmanova72

ну вот вы вопросы дазавали, я пересправшивал, получилось в итоге что-то..

kruzer25

получилось в итоге что-то..
Нихера в итоге не получилось.
А если реальный автор вопроса даже не знает, что он хочет - нахуя ему вообще нужен SQL? Пусть идёт подметать подметать улицы, быдлокодеров, мнящих себя "ниибаццо ИТшниками", и без него хватает.

Usmanova72

Ну пиздец!

Usmanova72

в общем, доказал чуваку, что вторая таблица избыточна и что ID в первой таблице можно брать упорядоченными и без пропусков чисел, т.к. можно сделать подобный вложенный запрос. и таким образом задача сводится:
Таблица с полями
ID NAME VAL
Написать запрос, который выдаст для каждого ID одинаковые строчки в количестве VAL cо значениями NAME.

pitrik2

Написать запрос, который выдаст для каждого ID одинаковые строчки в количестве VAL cо значениями NAME.
ну про это тебе уже говорили:
на общем sql задача не решается
для каждой субд решение будет свое, для оракла и kdb+ тебе решение дали
как видишь эти решения совсем не похожи друг на друга :)

Usmanova72

MS SQL походу надо.
Оставить комментарий
Имя или ник:
Комментарий: