Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RFpro.ru: Базы данных MySQL


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Megaloman
Статус: Академик
Рейтинг: 327
∙ повысить рейтинг »
solowey
Статус: Практикант
Рейтинг: 229
∙ повысить рейтинг »
SAW
Статус: 7-й класс
Рейтинг: 49
∙ повысить рейтинг »

∙ Базы данных

Номер выпуска:536
Дата выхода:12.05.2019, 18:45
Администратор рассылки:Коцюрбенко Алексей Владимирович (Модератор)
Подписчиков / экспертов:20 / 16
Вопросов / ответов:3 / 9

Консультация # 123529: Уважаемые эксперты, прошу вас объяснить мне на примере такое объединение как INNER (LEFT, RIGHT) JOIN. Собственно говоря при объединении двух таблиц все понятно. Мне же необходимо объединить 4 таблицы. И здесь становится непонятным для меня сама запись такого объединения. Я хотя и методом подбора, но нашел правильную запись такого объединения для м...
Консультация # 124152: Уважаемые эксперты, приведённым в приложении запросом я считаю колличество записей с уникальным ip и free равным нулю. Мне нужно модифицировать данный запрос так, чтобы он возвращал так-же(т.е. сразу 2 значения) колличество уникальных ip с free равным единице. Спасибо....
Консультация # 126761: Добрый день! Подскажите, пожалуйста, каким образом экспортировать данные (таблицы) из СУБД Firebird_1.5 в MSAccess. С базой Firebird я работаю через граф.интерфейс IBExpert. В нем используется 3-й диалект SQL. Имеется множество таблиц. Нужно экспортировать определенные таблицы в Access для дальнейшего их использования в ГИС ZULU. (Данные из Ac...

Консультация # 123529:

Уважаемые эксперты, прошу вас объяснить мне на примере такое объединение как INNER (LEFT, RIGHT) JOIN. Собственно говоря при объединении двух таблиц все понятно. Мне же необходимо объединить 4 таблицы. И здесь становится непонятным для меня сама запись такого объединения. Я хотя и методом подбора, но нашел правильную запись такого объединения для моего примера, однако объяснить почему именно так не могу.
Вот пример:

SELECT <поля>
FROM (((Dovidnyktvaruntable LEFT JOIN Tvarunutable ON Dovidnyktvaruntable.ID=TvarunuTable.name)
LEFT JOIN Personaltable ON Tvarunutable.domogospodarstvo=PersonalTable.domogospodarstvo)
LEFT JOIN Gosptable ON Tvarunutable.domogospodarstvo=GospTable.ID)
LEFT JOIN Relationstable ON Personaltable.relation=RelationsTable.ID
WHERE <условие>

У меня есть:
таблица с перечнем людей Personaltable, которые живут в хозяйствах
таблица с перечнем хозяйств Gosptable
таблица с перечнем животных Tvarunutable, которыми владеет хозяйство
таблица Dovidnyktvaruntable с перечнем видов животных (справочник)
таблица Relationstable с перечнем семейных отношений

Мне необходимо вывести следующую информацию:
Фамилия, имя человека, который проживает в хозяйстве (номер хозяйства), в каких семейных отношениях она к председателю хозяйства (сын, дочь...), и сколько в данном хозяйстве, например, коров. То есть:
№ хозяйства, фамилия, имя, семье отношения, вид скота, количество скота.

Вышеприведенный пример выводит данную информацию, однако я не могу объяснить почему именно так, а не иначе?
Объясните пожалуйста, как в этом примере происходит объединение. Какой таблицы с которой? Я знаю какое объединение мне необходимо, но я не могу его увидеть именно в этом примере.
Наведите, если можно, общую конструкцию объединения нескольких таблиц.
Работаю с базой MS Access, драйверы доступа в БД MS Jet 4.x

И еще одно. Прочитал, что операция объединения JOIN выполняется медленнее, чем обычное объединение с указыванием условия в WHERE. Так ли оно и насколько медленно?

Буду очень благодарным за конструктивный ответ.

Дата отправки: 17.02.2008, 15:38
Вопрос задал: Bohdan Andriyetskyy
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Игорь Елизаров:

Здравствуйте, Bohdan Andriyetskyy!
для начала надо представить себе структуру таблиц и их взаимосвязи, потом уже станет легко, например,
Gosptable клчевое поле GospID
животные Tvarunutable содержит свое ключевое поле и поле id хозяйста
люди содержит свой ид и связь с хозяйством
родственные отношения содержит свой ид и связь с таблицей людей

связи в запросе получатся следующие
люди - хозяйство
хозяйство - животные
животные - виды животных
родственники - люди

самая главная таблица - люди и с ней LEFT JOIN связываем остальные таблицы
ну а дальше

select (поля)
from personaltable
left join Relationstable ON Personaltable.relation=RelationsTable.ID
left join gosptable on personaltable.gosptableia = gosptable.id
left join tvaruntable on gosptable.id = tvaruntable.gosptableid

left join Dovidnyktvaruntable LEFT JOIN Tvarunutable ON Dovidnyktvaruntable.ID=TvarunuTable.name

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

Консультировал: Игорь Елизаров
Дата отправки: 17.02.2008, 23:16
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует din:

Здравствуйте, Bohdan Andriyetskyy!
Существует два вида соединения при помощи оператора JOIN, это:
INNER JOIN (внутренне соединение)— в этом случае будут выбраны только те записи из таблиц, которые удовлетворяют условию стоящему после ключевого слова ON;
OUTER JOIN (внешнее соединение) — при использовании данного типа соединения будут выбраны все строки той или иной таблицы. Все записи какой из таблиц выводить задается с помощью слов LEFT или RIGHT. Если указывать просто оператор JOIN, то будет сделано внутреннее соединение. Если указано хотя бы одно из ключевых LEFT или RIGHT, то будет сделано внешнее соединение.
Когда в запросе соединяются более 2 таблиц выборка происходит следующим образом, покажем на Вашем примере:

SELECT <поля>
FROM (((Dovidnyktvaruntable LEFT JOIN Tvarunutable ON Dovidnyktvaruntable.ID=TvarunuTable.name)
LEFT JOIN Personaltable ON Tvarunutable.domogospodars tvo=PersonalTable.domogospodarstvo)
LEFT JOIN Gosptable ON Tvarunutable.domogospodarstvo=GospTable.ID)
LEFT JOIN Relationstable ON Personaltable.relation=RelationsTable.ID
WHERE <условие>


Соединение у нас внешнее, первая строка соединения
Dovidnyktvaruntable LEFT JOIN Tvarunutable ON Dovidnyktvaruntable.ID=TvarunuTable.name, она говорит:
Выбрать все строки из таблицы Dovidnyktvaruntable, а из таблицы Tvarunutable выбрать только те, которые удовлетворяют условию Dovidnyktvaruntable.ID=TvarunuTable.name (если в Tvarunutable не будет записей по этому условию, то в соответствующих столбцах будет стоять значение NULL).
Следующая строка LEFT JOIN Personaltable ON Tvarunutable.domogospodarstvo=PersonalTable.domogospodarstvo также указывает на то что соединение внешнее, но происходит оно с результатом, который получен согласно условиям первой строки. Остальные соединения в этом запросе происходит по такому же принципу, каждое следующее с результатом предыдущей.
Что касается скорости исполнения запросов с использованием операторов JOIN, то они действительно выполняются дольше, чем при использовании старого способа соединения используя алиасы и фильтры после ключевого слова WHERE. Насколько дольше сказать точно нельзя, потому что скорость выполнения запроса будет зависеть:
1.От типа БД
2.От количества записей в таблицах
3.От индексированности столбцов или предопределенных в БД зависимостей
В общем, это нужно определять опытным путем для конкретного случая.

Надеюсь смог помочь. Удачи!

Консультировал: din
Дата отправки: 18.02.2008, 00:33
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 124152:

Уважаемые эксперты, приведённым в приложении запросом я считаю колличество записей с уникальным ip и free равным нулю.

Мне нужно модифицировать данный запрос так, чтобы он возвращал так-же(т.е. сразу 2 значения) колличество уникальных ip с free равным единице.
Спасибо.

Дата отправки: 21.02.2008, 05:29
Вопрос задал: Миленин Александр
Всего ответов: 6
Страница онлайн-консультации »


Консультирует Raptor3:

Здравствуйте, Миленин Александр!

select count(distinct(ip)) from lan where free=0 or (free=1) group by free

select count(distinct(ip)),free from lan where free=0 or (free=1) group by free
(кол-во и тип 0 или 1)

Консультировал: Raptor3
Дата отправки: 21.02.2008, 05:52
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Esi:

Здравствуйте, Миленин Александр!
Для этого нужно:
SELECT 0 as prizn_free, COUNT(DISTINCT `ip`) AS `num` FROM `lan` WHERE `free`=\'0\'
union all
SELECT 1 as prizn_free, COUNT(DISTINCT `ip`) AS `num` FROM `lan` WHERE `free`=\'1\'
order by prizn_free
Это один из вариантов.

Удачи!

Консультировал: Esi
Дата отправки: 21.02.2008, 06:39
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Силантьев А.В.:

Здравствуйте, Миленин Александр!
Присоединяюсь к ответу Raptor,
но только ко второй его части.
Первая часть ответа не подходит.
Итак:
select free as `type`, count(distinct(ip)) AS `num`
from lan where free=0 or free=1
group by free

Консультировал: Силантьев А.В.
Дата отправки: 21.02.2008, 08:52
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Sergey T:

Здравствуйте, Миленин Александр!

Вообще нет особой разницы, что именно использовать - UNION или GROUP BY.
Только например с GROUP BY можно вернуть количество уникальных IP по всем free, которые имеются в таблице. Но если бы мне нужно было толко по двум значениям - я бы наверно воспользовался объединением.

Вот еще несколько вариантов:

- возвращаем количество уникальных IP по всем имеющимся значениям FREE (с сортировкой по FREE)

SELECT \'free\', COUNT(DISTINCT(\'ip\')) AS \'num\'
FROM \'lan\'
GROUP BY \'free\'
ORDER BY \'free\'

- то же самое, только уже с условием по нужным FREE

SELECT \'free\', COUNT(DISTINCT(\'ip\')) AS \'num\'
FROM \'lan\'
WHERE \'free\' IN (0, 1) -- тут перечисляем через запятую все нужные нам FREE
GROUP BY \'free\'
ORDER BY \'free\'

- с использованием объединения все аналогично ответу ESI, правда можно без ALL, так как значения FREE мы уже ставим уникальные. Но это уже как кому приятнее.

Удачи.

Консультировал: Sergey T
Дата отправки: 21.02.2008, 09:39
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Zinaida:

Здравствуйте, Миленин Александр!Такой запрос можно модифицировать так:
SELECT COUNT(DISTINCT `ip`) AS `num` FROM `lan` WHERE `free`=\'0\'
UNION
SELECT COUNT(DISTINCT `ip`) AS `num` FROM `lan` WHERE `free`=\'1\'
Можно так:
select distinct \'ip\', count(*) from \'lan\'
where `free`=\'0\' or `free`=\'1\'
group by \'ip\'

Консультировал: Zinaida
Дата отправки: 21.02.2008, 10:31
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Синельников Сергей:

Здравствуйте, Миленин Александр!

Смею предположить, что из одной записи более удобно получать результаты. А по сему вот:

SELECT COUNT(DISTINCT `ip`*`free`)-1 AS `numfree1`, COUNT(DISTINCT `ip`*(`free`-1))-1 AS `numfree0`FROM `lan` WHERE `free`=0 OR `free`=1

В первом столбце будет для free=1, во втором для free=0

Консультировал: Синельников Сергей
Дата отправки: 25.02.2008, 21:25
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 126761:

Добрый день! Подскажите, пожалуйста, каким образом экспортировать данные (таблицы) из СУБД Firebird_1.5 в MSAccess.
С базой Firebird я работаю через граф.интерфейс IBExpert. В нем используется 3-й диалект SQL. Имеется множество таблиц. Нужно экспортировать определенные таблицы в Access для дальнейшего их использования в ГИС ZULU. (Данные из Access экспортируются в ZULU через драйвер ODBC. В самом ZULU все настроено).
Проблема состоит в том, чтобы выгрузить данные из Firebird в Access.
Нужно ли подключать какие-то драйвера (н-р, ODBC), либо возможно сделать выгрузку с помощью запроса SQL? И как это правильно сделать? Возможно, Вы подскажете полезные ссылки.
Заранее, спасибо за внимание и рассмотрение моего вопроса!

Дата отправки: 11.03.2008, 12:14
Вопрос задал: Ruvik07
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Архангельский Андрей Германови:

Здравствуйте, Ruvik07!
Я бы подключился к Firebird черех IBX, а к Access черех ADO.
Взял бы запросом данные из Firebird и сразу засунул их в в Access.
ЕСли бы Access поддерживал нормально срипты, то все было бы много проще.

Консультировал: Архангельский Андрей Германови
Дата отправки: 11.03.2008, 12:23
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное