Если кому интересно - задачки по SQL с собеседований

Selena

1)Условие: Есть табличка TABLE1 с уникальным полем типа integer - ID и полем NAME
Задача: Вывести все записи таблицы в произвольном порядке, пронумеровав их.
2)Уcловие: есть запрос


SELECT T1.ID + 1, MIN(T2.ID) - 1, MIN(T2.ID) - T1.ID - 1
FROM TABLE1 T1 JOIN TABLE T2 ON (T1.ID < T2.ID)
GROUP BY T1.ID
HAVING T2.ID > T1.ID + 1


Задача: что он делает?
3)Условие: есть табличка


LID LPARENT LNAME
1 0 ТОВАР
2 0 УСЛУГИ
3 1 ОБУВЬ
4 1 ОДЕЖДА
5 3 NIKE
6 4 ADIDAS


Задача: написать запрос, результат которого будет выглядеть следующим образом:


ТОВАР ОБУВЬ NIKE
ТОВАР ОДЕЖДА ADIDAS
УСЛУГИ NULL NULL

aliska12

Последние две, вроде, решили, а вот первую никак. Подскажи решение, плз.

Marinavo_0507



SELECT t1.NAME as Name, count(*) as Index
FROM TABLE1 as t1, TABLE1 as t2
WHERE t2.ID<=t1.ID
GROUP BY t1.NAME

aliska12

Насколько я понимаю, это не решает задачи.
1 n1
3 n2
2 n3
4 n4
Твой выдаст:
n1 1
n2 3
n3 2
n4 4
а должен:
1 1 n1
2 3 n2
3 2 n3
4 4 n4
В любом случае, неправильно пронумерованы поля.

Marinavo_0507



SELECT count(*) as Index, t1.ID as ID, t1.NAME as NAME
FROM TABLE1 as t1, TABLE1 as t2
WHERE t2.ID<=t1.ID
GROUP BY t1.NAME
ORDER BY Index

aliska12

это тоже неправильно. Возьми мой пример и посчитай ручками декартово произведение, выкинь кортежи, которые не удовлетворяют твоему условию (<=) и тд.
Во-первых твой алгоритм сделает перестановку строк изначальной таблицы (вроде, это нарушение условия задачи); во-вторых, твой GROUP BY t1.NAME все портит. Тебе надо было сказать
GROUP BY t1.ID. Тогда ты бы все занумеровал, но не попорядку.

aliska12

Возможно, я усложнил задачу, но, мне кажется, что ID должны выдаваться в том же порядке, в котором они записаны изначально, а твой вариант меняет этот порядок, хотя и нумерует кортежи.

sergei1969

>>Задача: Вывести все записи таблицы в произвольном порядке, пронумеровав их.
маза ты плохо читал условие

aliska12

Да, ты прав
У меня склонность к усложнению задач. А теперь давайте ее решим в моей постановке или докажем, что это невозможно в рамках стандарта SQL
Необходимо сделать нумерацию, не изменяя первоначальной очередности кортежей.

Marinavo_0507

В исходной постановке речь шла про записи, а не про кортежи.
Я бы воспринял это как намёк, что решение должно быть практическим,
то есть должно работать, а не удовлетворять стандартам

aliska12

это собеседование, на котором проверяют твое знание (понимание) sql. Мой сосед написал соответствующую программу (причем в моей более сложной постановке) на оракловском диалекте за 1 минуту, но интересно-то именно в стандарте.
ЗЫ: я по прежнему считаю, что твоя прога не работает (даже в исходной постановке). Твой первый вариант мы даже прогнали на машине. Второй - на уровне логики (см. мой пост где-то выше). Ты его прогонял на примерах? (сосед спит, так что я проверить не могу)

Marinavo_0507

да, надо group by t1.ID, ты прав

fnl80

А третья?
Что то вроде такого:
SELECT 'ТОВАР', 'ОБУВЬ', 'NIKE'
UNION
SELECT 'ТОВАР','ОДЕЖДА','ADIDAS'
UNION
SELECT 'УСЛУГИ','NULL','NULL'

myrka68

Selena

что-то типа:


SELECT L1.LNAME, L2.LNAME, L3.LNAME
FROM LIB L1 LEFT JOIN LIB L2 ON(L1.LID=L2.LPARENT) LEFT JOIN LIB L3 ON(L2.LID=L3.LPARENT)
WHERE L1.LPARENT=0


P.S. Забыл - табличка называется LIB
Оставить комментарий
Имя или ник:
Комментарий: