Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорее двойной запрос: Данные и кол-во связей, Скорее двойной запрос: Данные и кол-во с 
:(
    Опции темы
lestat89
Дата 17.11.2014, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.11.2014

Репутация: нет
Всего: нет



Здравствуйте, Ув. Форумчане!


Всю голову изломал как сделать такой запрос, буду краток:

БД: В приложенном файле
Таблица: STRUCTURE
Необходимо:
мммм.... напишу наверное ввиде неправильного запроса что бы было понятно:
SELECT        ID, NAME, POD, (SELECT COUNT(*) FROM STRUCTURE WHERE POD=ID)
FROM            STRUCTURE
WHERE        (POD = @structureIndex)


то есть все данные и количество связей.
То что это возможно не возможно я так же понимаю, но все же...

p.s.:
И наверное поясню суть
Таблица STRUCTURE - Это структура предприятия
ID - итак понятно (АИ)
NAME - Ее название
POD - Это ID подструктуры, т.е. одна структура может быть вложена в другую и при их выводе (когда показаны главные структуры (POD=0) Хотелось бы сразу значть сколько каждая структура содержит подструктур.

Все это я делаю в MVS 2013 C#
БД: FireBird


Это сообщение отредактировал(а) lestat89 - 17.11.2014, 22:47

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Безымянный.gif 114,71 Kb
PM MAIL   Вверх
tzirechnoy
Дата 18.11.2014, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



А почему Вы думаете, что Ваш запрос -- неправильный?

Добавлено через 35 секунд
Ну, то есть там максимум можно COALESCE добавить, но это во многом эстэтство.

Добавлено через 1 минуту и 6 секунд
А, не, туплю конечно. В подзапросе табличку надо переименовать и обращаться только по полному имени (alias.field).
PM MAIL   Вверх
lestat89
Дата 18.11.2014, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.11.2014

Репутация: нет
Всего: нет



Цитата(tzirechnoy @  18.11.2014,  01:56 Найти цитируемый пост)
А почему Вы думаете, что Ваш запрос -- неправильный?

Потому что студия ругается на него.
Цитата(tzirechnoy @  18.11.2014,  01:56 Найти цитируемый пост)
полному имени (alias.field). 

Пробовал, ничего не меняется.

Добавлено через 2 минуты и 23 секунды
Возможно правильно 
SELECT *, COUNT(*) FROM STRUCTURE WHERE pod=@Param GROUP BY NAME
Но студия пропускает только
 SELECT *, COUNT(*) FROM STRUCTURE WHERE pod=@Param GROUP BY NAME, ID,POD

Добавлено через 3 минуты и 22 секунды
Хотя я не уверен, мне же нужно для каждого id каждой строки посчитать сколько других строк на этот id ссылаються
PM MAIL   Вверх
Akina
Дата 18.11.2014, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

SELECT t1.ID, t1.NAME, t1.POD, COUNT(t2.ID) AS links
FROM structure AS t1
LEFT JOIN structure AS t2 ON t1.ID = t2.POD
GROUP BY t1.ID, t1.NAME, t1.POD


Добавлено через 5 минут и 25 секунд
Цитата(lestat89 @  18.11.2014,  09:35 Найти цитируемый пост)
студия пропускает только

Правильно. Поле выходного набора, не являющееся аргументом групповой функции, ОБЯЗАНО быть полем группировки.

Добавлено через 6 минут и 57 секунд
PS. НИКОГДА не ставь в списке полей выходного набора запроса с группировкой звёздочку. Как только в структуру будут внесены изменения - все запросы немедленно перестанут работать. Перечисляй поля явно, не переломишься.

Это сообщение отредактировал(а) Akina - 18.11.2014, 08:56


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
tzirechnoy
Дата 18.11.2014, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
Правильно. Поле выходного набора, не являющееся аргументом групповой функции, ОБЯЗАНО быть полем группировки.


Вот только во внешнем запросе нет никакой группировки, а во внутреннем единсвенное поле -- результат групповой функцыи count(*).

Цитата
НИКОГДА не ставь в списке полей выходного набора запроса с группировкой звёздочку.


В count(*) всегда так делаю.
PM MAIL   Вверх
Akina
Дата 18.11.2014, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(tzirechnoy @  18.11.2014,  12:38 Найти цитируемый пост)
Вот только во внешнем запросе нет никакой группировки, а во внутреннем единсвенное поле -- результат групповой функцыи count(*).

Это обычная невнимательность. Посмотри, о чём именно я говорил.

Цитата(tzirechnoy @  18.11.2014,  12:38 Найти цитируемый пост)
В count(*) всегда так делаю. 

Пора бы научиться отличать список выходного набора от аргумента групповой функции.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
lestat89
Дата 18.11.2014, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.11.2014

Репутация: нет
Всего: нет



Цитата(Akina @  18.11.2014,  08:52 Найти цитируемый пост)

Код

SELECT t1.ID, t1.NAME, t1.POD, COUNT(t2.ID) AS links
FROM structure AS t1
LEFT JOIN structure AS t2 ON t1.ID = t2.POD
GROUP BY t1.ID, t1.NAME, t1.POD


Ну код нужен с WHERE, я добавил это и получилось
Код

SELECT        t1.ID, t1.NAME, t1.POD, COUNT(t2.ID) AS links
FROM            structure t1 LEFT OUTER JOIN
                         structure t2 ON t1.ID = t2.POD
WHERE        (t1.ID = @IndexStructure)
GROUP BY t1.ID, t1.NAME, t1.POD


Результат 0 строк.
Т.е. не получаю никаких данных вообще.
--------------------------------------------------
И все равно в запросе не очень то.
Мне нужен результат стандартного select * from structure where pod=@Param и плюс к каждой возращаемой строке еще один столбец в результате которого select count(*) from structure where pod=ID_текущей_строки
В одном запросе.
Реально ?

Это сообщение отредактировал(а) lestat89 - 18.11.2014, 16:55
PM MAIL   Вверх
Akina
Дата 18.11.2014, 17:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



У меня такое впечатление, что Вы мне лапшу на уши вешаете.
Правда, у меня нет файрбёрда, проверял в MySQL, вот цитата с консоли:
Код

mysql> create table structure (
    -> id int auto_increment primary key,
    -> name varchar(15),
    -> pod int );
Query OK, 0 rows affected (1.91 sec)

mysql> insert into structure (name, pod)
    -> select 'main1', 0 union all
    -> select 'main2', 0 union all
    -> select 'sub11', 1 union all
    -> select 'sub12', 1 union all
    -> select 'sub13', 1 union all
    -> select 'sub21', 2 union all
    -> select 'sub22', 2 union all
    -> select 'sub12sub1', 4;
Query OK, 8 rows affected (0.40 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> select * from structure;
+----+-----------+------+
| id | name      | pod  |
+----+-----------+------+
|  1 | main1     |    0 |
|  2 | main2     |    0 |
|  3 | sub11     |    1 |
|  4 | sub12     |    1 |
|  5 | sub13     |    1 |
|  6 | sub21     |    2 |
|  7 | sub22     |    2 |
|  8 | sub12sub1 |    4 |
+----+-----------+------+
8 rows in set (0.00 sec)

mysql> SELECT t1.ID, t1.NAME, t1.POD, COUNT(t2.ID) AS links
    -> FROM structure AS t1
    -> LEFT JOIN structure AS t2 ON t1.ID = t2.POD
    -> GROUP BY t1.ID, t1.NAME, t1.POD
    -> ;
+----+-----------+------+-------+
| ID | NAME      | POD  | links |
+----+-----------+------+-------+
|  1 | main1     |    0 |     3 |
|  2 | main2     |    0 |     2 |
|  3 | sub11     |    1 |     0 |
|  4 | sub12     |    1 |     1 |
|  5 | sub13     |    1 |     0 |
|  6 | sub21     |    2 |     0 |
|  7 | sub22     |    2 |     0 |
|  8 | sub12sub1 |    4 |     0 |
+----+-----------+------+-------+
8 rows in set (0.08 sec)

mysql> SELECT t1.ID, t1.NAME, t1.POD, COUNT(t2.ID) AS links
    -> FROM structure AS t1
    -> LEFT JOIN structure AS t2 ON t1.ID = t2.POD
    -> WHERE t1.ID = 2
    -> GROUP BY t1.ID, t1.NAME, t1.POD
    -> ;
+----+-------+------+-------+
| ID | NAME  | POD  | links |
+----+-------+------+-------+
|  2 | main2 |    0 |     2 |
+----+-------+------+-------+
1 row in set (0.00 sec)

mysql>


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

Добавлено через 11 минут и 12 секунд
Нашёл, где у меня в сети есть файрбёрд. Версия 2.5.
Создал ту же структуру. Внёс те же данные. Выполнил те же запросы. Получил абсолютно те же результаты.
Вывод неутешителен. Для Вас...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
lestat89
Дата 18.11.2014, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.11.2014

Репутация: нет
Всего: нет



Да, Вы правы!!! )
Банально не работало из-за регистра в названии таблиц.
Все сделал, примного благодарен!
PM MAIL   Вверх
Akina
Дата 18.11.2014, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(lestat89 @  18.11.2014,  18:41 Найти цитируемый пост)
не работало из-за регистра в названии таблиц

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.