Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Sqlite3 Данные из 3 таблиц одним запросом

Добрый день. Нужна помощь гуру sql запросов.
Работаю с sqlite3. Пытаюсь вытащить данные из 3 таблиц одним запросом.
Связь между таблицами по внешнему ключу такая: DBtableRooms (DBtableRooms.ID), DBtableSensors(DBtableSensors.RoomID) и DBtableDoors(DBtableDoors.RoomID)
Делаю такой запрос:
SQL
1
2
3
4
5
SELECT DBtableRooms.ID, DBtableRooms.Number, DBtableRooms.Name, DBtableSensors.ID, DBtableSensors.Name, DBtableDoors.ID, DBtableDoors.Name
FROM DBtableRooms
LEFT OUTER JOIN DBtableSensors ON (DBtableSensors.RoomID = DBtableRooms.ID) AND (DBtableSensors.ShowMC = 1)
LEFT OUTER JOIN DBtableDoors ON (DBtableDoors.RoomID = DBtableRooms.ID) AND (DBtableDoors.ShowACS = 1) 
WHERE DBtableRooms.ID = 3
Получаю результат (на скрине во вложении).
Не устраивает то, что в столбцах ID2 и Name2 (строки 2,3,4) значения повторяются, хотелось бы увидеть там пустые ячейки. Т.к. в помещениях разное количество дверей и датчиков и эти дублирования сильно напрягают.
Помогите доработать запрос или может связь между таблицами поправить нужно.
Ответ: Ну если нужно принципиально в одном запросе, то, боюсь, на Sqlite3 не получить 3х2=3.
Тогда вам на Oracle или MS SQL нужно, где подзапросы можно связать ещё и по Row_Number().
Или два независимых грида рядом, один для дверей, другой - для датчиков

Добавлено через 5 минут
посмотри на комнату с несколькими дверями и несколькими датчиками. С помощью твоего запроса. И придумай для начала, что там ты хотел бы "обнулить"
Вопрос: Данные из 3 таблиц одним запросом

Добрый день. Нужна помощь специалистов по sql запросам.
Работаю с sqlite3. Пытаюсь вытащить данные из 3 таблиц одним запросом.
Связь между таблицами по внешнему ключу такая: DBtableRooms (DBtableRooms.ID), DBtableSensors(DBtableSensors.RoomID) и DBtableDoors(DBtableDoors.RoomID)
Делаю такой запрос:
SELECT DBtableRooms.ID, DBtableRooms.Number, DBtableRooms.Name, DBtableSensors.ID, DBtableSensors.Name, DBtableDoors.ID, DBtableDoors.Name
FROM DBtableRooms
LEFT OUTER JOIN DBtableSensors ON (DBtableSensors.RoomID = DBtableRooms.ID) AND (DBtableSensors.ShowMC = 1)
LEFT OUTER JOIN DBtableDoors ON (DBtableDoors.RoomID = DBtableRooms.ID) AND (DBtableDoors.ShowACS = 1) 
WHERE DBtableRooms.ID = 3

Получаю результат (на скрине во вложении верхняя таблица).
Не устраивает то, что в столбцах ID2 и Name2 (строки 2,3,4) значения повторяются, хотелось бы увидеть там пустые ячейки (нижняя таблица). Т.к. в помещениях разное количество дверей и датчиков и эти дублирования сильно напрягают.
Если реально получить нужный результат, помогите, пожалуйста, доработать запрос.

К сообщению приложен файл. Размер - 72Kb
Ответ:
VSVLAD
blur

Лучше "форматирование результатов" сделать на стороне клиентского приложения, а не SQL


Да я тоже уже пришел к такому выводу.
Вопрос: Можно ли передать данные от одного запроса в другой через параметры напрямую?

Можно ли передать данные от одного запроса в другой через параметры напрямую?
Ответ: mrmaxim,

Select * from (select ...)
Вопрос: Сделать выборку из 3 таблиц одним запросом используя массив находящийся в первой таблице

Здравствуйте, имеются 3 таблицы. В таблице 1 в текстовом поле(utf8_general_ci) хранится массив, каждый элемент разделен на 2 части двоеточием. 1я часть это id из таблицы 2, 2я часть это id из таблицы 3.
[img='Mysql.jpg']
Нужно сделать выборку одним запросом из трех таблиц, данные из таблицы 2 и таблицы 3, должны соответствовать последним 10 элементам массива поля array. Название таблицы 3 может быть разным т.е. вместо таблицы 3 будет несколько таблиц одинаковой структуры.
Вот что нашёл по данному вопросу:


Но все равно не могу сообразить как это сделать, подскажите пожалуйста!
(Важно сделать выборку одним запросом)

К сообщению приложен файл. Размер - 146Kb
Ответ: Регулярки тут вообще ни к месту - всё равно ими не получится выкроить кусок из значения поля для дальнейшей обработки. А если в запрос воткнуть синтетическую таблицу, производящую числа от 1 до 10, то вполне хватит и встроенных текстовых функций. А о производительности на такой структуре заикаться можно даже не начинать.
Вопрос: Несколько выборок в одном запросе - возможно ли?

Добрый день!

Есть несколько однотипных запросов по разным параметрам.

SQL
1
2
3
4
SELECT US_Report.DSLAM, COUNT(US_Report.port_number) AS Физ
FROM US_Report
WHERE (((US_Report.client_type) LIKE 'ФИЗ. ЛИЦО'))
GROUP BY US_Report.DSLAM;
SQL
1
2
3
4
SELECT US_Report.DSLAM, COUNT(US_Report.port_number) AS Юр
FROM US_Report
WHERE (((US_Report.client_type) LIKE 'ЮР. ЛИЦО'))
GROUP BY US_Report.DSLAM;
Можно ли все это сделать одним запросом, результаты выводить в разные столбцы, получив таблицу следующего типа?

DSLAM ЮрФиз
aht2-smr-34871035
aht2-smr-5445839
aht2-smr-5446440
Ответ: Можно двумя способами: запросом с Union или Sum с условием. Привожу SQL запроса по второму способу
SQL
1
2
3
SELECT US_Report.DSLAM, -SUM(client_type='ФИЗ. ЛИЦО') AS Физ, -SUM(client_type='ЮР. ЛИЦО') AS Юр
FROM US_Report
GROUP BY US_Report.DSLAM
Вопрос: Процедура: множественное добавление в таблицу одним запросом

Доброго времени суток!

есть таблица table, в ней поля name, chislo.

Как с помощью процедуры добавить одним запросом несколько строк?

т.е. вызываем процедуру, передаем ей параметры: имя, 1, имя2, 2, имя3, 3, имя4, 4
после заносится в таблицу 4 строки.
name chislo
имя 1
имя2 2
имя3 3
имя4 4

Добавлено через 4 часа 23 минуты
Число строк заранее неизвестно
Ответ:
1. если слышал (а не просто "слышал") чего += для строк пользуем? Да еще и string.Format точно не знаешь
2. а зарадидля неполный код выкладывать?
3. какой смысл в этом, если одновременно 100500 человек обновят 100600 записей?
Вопрос: Подсчет количества строк в нескольких таблицах одним запросом

Есть 3 таблицы с разными данными и между собой у них нет связи, т.е. поля не пересекаются. Существует к ним 3 запроса:

SQL
1
2
3
"SELECT SQL_CACHE COUNT(id1) AS id1 FROM table1 WHERE a='1'";
"SELECT SQL_CACHE COUNT(id2) AS id2 FROM table2 WHERE b='1'";
"SELECT SQL_CACHE COUNT(id3) AS id3 FROM table3 WHERE s='1'";
Подскажите, как все это реализовать только всего одним запросом?
Ответ: Конечно, поздно уже, но все же, может быть, кому-то в дальнейшем поможет.
SQL
1
2
3
4
5
6
    SELECT SUM(T.c) FROM (
    SELECT COUNT(*) AS c FROM table1
    UNION ALL
    SELECT COUNT(*) AS c FROM table2
    UNION ALL
    SELECT COUNT(*) AS c FROM table3) T
или же
SQL
1
2
3
4
5
6
    SELECT СOUNT(T.id) FROM (
    SELECT id FROM table1
    UNION ALL
    SELECT id FROM table2
    UNION ALL
    SELECT id FROM table3) T
Вопрос: Нахождение уникальных значений из таблицы по нескольким условиям

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

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

IDpar1par2
id1aabb
id1aabb
id1aanull
id1nullbb
id1nullnull
id2aanull
id2nullbb
.........

Итоговый select должен содержать по одному уникальному идентификатору с параметрами, которые должны удовлетворять следующим условиям:
1. Если заполнены оба параметра, то выбирается par1 = aa, par2 = bb,
2. Если заполнен первый параметр, то выбирается par1= aa, par2 = null
3. Если заполнен второй параметр, то выбирается par1=null, par2 = bb
4. Если оба параметры не заполнены, то выбирается par1 = null, par2 = null.

В примере из таблицы, параметры для идентификатора id1 удовлетворяют первому условию, а параметры для идентификатора id2 второму.
Итог должен получиться таким:
id1,aa,bb
id2,aa,null

Заранее спасибо!
Ответ: YuryK, invm, Вероятно, я неправильно выразился. С CTE не сталкивался в принципе, информация по первым ссылкам в гугле навела на мысль о рекурсии.
Тема поста связана с решением составной части задачи.
Изначально есть три таблицы с различными данными, в каждой имеется идентификатор ID. В двух таблицах содержатся дубли, которые чистятся с помощью предложенных Вами запросов.

Задача состоит в том, чтобы отразить статистику в одном запросе с помощью группировки параметров по объединенной таблице, которая содержит только уникальные записи ID.
Вопрос: Доступ к полям текущей строки таблицы из запроса в "источнике строк"

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

Есть три таблицы.
1. Персонал (номер, ФИО)
2. Преподает (персонал_номер, Предмет)
3. Расписание (Предмет, день_недели, Преподаватель)

Используется Access.
Как сделать так, чтобы при редактировании 3й таблицы при выборе предмета отсеивалась часть преподавателей, т.е. оставались только те, кто преподает этот предмет.

При использовании подстановки нужно в источник строк написать такой запрос:
SQL
1
2
3
SELECT Персонал.ФИО
 FROM Персонал, Преподает
 WHERE Персонал.номер=Преподает.номер AND ПРЕДМЕТ=Преподает.предмет;
Так вот вопрос: что нужно написать вместо ПРЕДМЕТ, чтобы получить значения предмета текущей строки.

Другими словами, как получить значения предмета текущей (которая вводится сейчас) строки, чтобы ее в запрос записать?
Ответ: ltv_1953, вот мы и ответили на первоначальный вопрос: "Возможно ли получить доступ к полям текущей строки таблицы из запроса в "источнике строк?" Ответ: "Можно, но только один раз для каждого поля (столбца). Поэтому рабочего диалога из таблицы не получится.
Сообщение от ltv_1953
Читайте самое начало - таблицы объект не программируемый ... . Типа обратиться в полю можно (это же решено), а вот изменение при переходе ... . И, еще раз, таблицы только для хранения данных (во всех базах, не только в Аксессе), не нужно пытаться сделать из них интерфейс ввода данных - для это есть формы.
".
ltv_1953 и PuhKMV, огромное спасибо за помощь!
Вопрос: Подскажите по group by одним запросом

Добрый день.

Предположим есть таблица:
id1    id2    id2_sum  id_3  id_4  sum
7      1      200      1     1	   1
7      1      200      2     1	   2
7      1      200      3     1	   4
7      1      200      2     2	   3
7      2      300      2     1	   2
7      2      300      1     1	   1
7      2      300      2     2	   3
8      1      700      2     2	   3

Можно ли одним запросом вывести:

id1 sum(id2_sum)  sum(sum)
7   500           16
8   700           3


Группировка идет по id1, а внутри нужно понимать что суммировать нужно только суммы с уникальными id2, суммы для поля sum нужно брать все.

Другими словами можно ли такой запрос сделать одним select'ом?

with group_sums as(
    select id1, sum(id2_sum)/count(id2) as id2_sum, sum(sum) as sum
    from test
    group by id1, id2
)
select id1, sum(id2_sum), sum(sum)
from group_sums
group by id1


Спасибо.
Ответ: Алексей Вейник,

А ваш WITH запрос — он и есть “один” запрос.

Не совсем понимаю что значит “только суммы с уникальными id2”, возможно так (только если id2 коррелирует с id2_sum, как в примере):
SELECT id1, sum(DISTINCT id2_sum), sum(sum)
  FROM group_sums
 GROUP BY id1;