:: Архив конференции по VFP до 2005 года
Красивый Select
PaulWist
Автор

Сообщений: 14601
Дата регистрации: 01.04.2004
Ребята.

Есть такая задачка.

CREATE CURSOR test (id i) && главная таблица
CREATE CURSOR test1 (ID_Test i, Su n(12,2), ID_Test1 i) && подчиненная таблица, имеющая ID_Test как FK главной
** ID_Test1 ссылка на ID главной таблицы, но не FK, SU - какая-то сумма
** Заполняем главную
INSERT INTO test (id) VALUES (1)
INSERT INTO test (id) VALUES (2)
** Заполняем ребенка
INSERT INTO test1 (id_test, Su, ID_test1) VALUES (1, 1, 0)
INSERT INTO test1 (id_test, Su, ID_test1) VALUES (1, 1, 0)
INSERT INTO test1 (id_test, Su, ID_test1) VALUES (2, 1, 0)
INSERT INTO test1 (id_test, Su, ID_test1) VALUES (2, 1, 1)
** для последней записи видим ID_test1 <> 0, те имеем ссылку на PK главной
** теперь - надо сделать выборку суммы поля Su из подчиненной таблицы по связии test1 t1 ON t.ID = t1.ID_Test
** двух таблиц, сгруппировать по ID, причем в сумму для ID = 1 надо приплюсовать значение Su из последней записи
** подчиненной ID_test1 <> 0
**те ID SUM
** 1 3
** 2 1
** Вообщем-то решение есть, но мне кажется м.б. другое, более красивое
SELECT id, SUM(Sum_Su) FROM ;
(select t.id, SUM(t1.Su) FROM test t ;
INNER JOIN test1 t1 ON t.ID = t1.ID_Test ;
WHERE t1.ID_Test1 NOT in (SELECT ID FROM test) ;
GROUP BY t.id ;
UNION ALL ;
select t.id, SUM(t1.Su) as Sum_Su FROM test t ;
INNER JOIN test1 t1 ON t.ID = t1.ID_Test1 ;
GROUP BY t.id) as tmp ;
GROUP BY id




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Красивый Select
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Чего-то я в Selecte ничего не понял особенно Not In и вообще он с синтаксической ошибкой
Паша - поконктретней что должно делаться




------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Красивый Select
Hel!Riser

Сообщений: 10452
Откуда: Нижний Новгород
Дата регистрации: 11.03.2001
селект красивый и так




------------------
Осторожно - глисты!
Ratings: 0 negative/0 positive
Re: Красивый Select
PaulWist
Автор

Сообщений: 14601
Дата регистрации: 01.04.2004
Вадим.

Есть родительская таблица (Test) имеющая PK - ID, в дочерней таблице (Test1) имеющей FK ID_Test на родителя, содержатся суммы Su, также в дочерней , есть ещё одна ссылка на родителя ID_Test1, но не являющаяся FK (поддерживается через триггер)

Что бы было совсем понятно, пример (реализующий эту структуру)

есть сотрудники (Test.ID) привозящие деньги (Test1.Su), надо посчитать ск-ко каждый сотрудник привез денег, НО бывают ситуации когда поехавший сотрудник деньги не привез, а вместо него привез другой сотрудник (Test1.ID_Test1), в итоге для нашего примера первый сотрудник по своим заказам привез Test1.ID_Test = 1,2 Su = 1 + 1 = 2, а так же привез и за сотрудника ID = 2 ещё Su = 1 - итого 2+1 = 3, соответственно второй (Test.ID = 2) привез 1.

Те первый Join - это подсчет суммы для тех кто ездил
второй Join - это сумма джля тех кто привез не за себя
Union - понятно обьединяем
Select - тоже понятно из двух выборок получаем результат.

Синтаксическая ошибка - попробуй в 9-ке (на самом деле этот тест для MSSQL)

2Hel!Riser

Спасибо.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Красивый Select
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Паша, думаю, что при этих условиях красивше не напишешь - отличный запрос - только чего ты в нем такого кривого увидел ?




------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Красивый Select
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Если я правильно тебя понял, то попробуй так:

SELECT test.id, SUM(test1.Sum_Su)
FROM test ;
INNER JOIN test1 ON test.id = IIF(test1.ID_Test1<>0,test1.ID_Test1,test1.id_Test) ;
GROUP BY test.id

Смысл в том, что если есть ненулевое значение поля test1.ID_Test1, то связку надо делать по нему, в противном случае связываемся по полю test1.id_Test. Если IIF() не проходит, то можно сформировать условие связи через несколько OR и AND (чтобы уйти от функции и выйти на возможную оптимизацию).




------------------
Ratings: 0 negative/0 positive
Re: Красивый Select
WiRuc

Сообщений: 1012
Дата регистрации: 09.04.2002
Для MSSQL

SELECT (CASE WHEN id_test1<>0 THEN id_test1 ELSE id_test END), SUM(Su) FROM test1 GROUP BY (CASE WHEN id_test1<>0 THEN id_test1 ELSE id_test END)
Ratings: 0 negative/0 positive
Re: Красивый Select
PaulWist
Автор

Сообщений: 14601
Дата регистрации: 01.04.2004
2Владимир Максимов

Владимир, замечательно.

Завтра сообщю, как прошел план выполнния, сейчас надо бежать.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Красивый Select
PaulWist
Автор

Сообщений: 14601
Дата регистрации: 01.04.2004
2WiRuc

Спасибо.

Не совсем то, что надо (в смысле нужно обьединение двух таблиц, а не поиск по одной, как сами понимаете приведен был только тест, а не рабочий вариант).

Идея видна невооруженным взглядом и перекликается с постом Владимир Максимов.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Красивый Select
PaulWist
Автор

Сообщений: 14601
Дата регистрации: 01.04.2004
2Владимир Максимов
2WiRuc


Спасибо, мужики.

План уменьшился в ТРИ раза, Duration больше чем в 2 раза. Люкс.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 11 (Гостей: 11)

© 2000-2024 Fox Club 
Яндекс.Метрика