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

Собственно вся проблема продемонстрирована на прилагаемом рисунке.
В некой таблице, существуют два поля, которые ссылаются на две справочные таблицы. Если создавая запрос, устанавливать связь с каждой таблицей-справочником отдельно, все работает корректно, если построить связь с двумя таблицами-справочниками сразу. Запрос построенный конструктором не работает. На выходе получается пустая таблица. Я не знаю как правильно построить запрос. С MS SQL дружу вторю неделю, знаний мало.
Ответ: Спасибо! Теперь работает.
Вопрос: Как правильно построить запрос с case и null ?

Как правильно построить запрос с case и null ?
Такая строчка отображает не правильные данные
Oracle 11 SQL
1
2
3
4
5
6
7
SELECT
...
(CASE WHEN pro.extacc IS NOT NULL THEN p1.clientname ELSE p1.benefname END) AS "что-то"
...
--реализовал у себя так, но это не правильное решение (хоть 0 встречается в 99.9% случаях, но есть и 0.01% что его не окажется)
(CASE WHEN pro.extacc LIKE '%0%' THEN p1.clientname ELSE p1.benefname END)AS "что-то"
...
ПРобовал и pro.extacc != null , <>null - так же не правильно.

в pro.extacc либо есть значение , либо нет.. из-за этого и нужна проверка на null..
Ответ: кстати, по поводу case и null

я бы грешил на вот эту строчку:
SQL
1
AND p1.benefacc = pro.extacc
эта строчка сразу отсеивает все записи, где pro.extacc IS NULL
Вопрос: Помогите правильно построить запрос

есть запрос типа

select * from userget

WHERE   
 
     ( 
     MATCH(SUBSTRING_INDEX(userget.uname, " ", -1)) AGAINST ('...текст...' IN BOOLEAN MODE)  
     )
         AND  
             
         ( 
         MATCH(SUBSTRING_INDEX(userget.uname, " ", -1)) AGAINST ('...текст...' IN BOOLEAN MODE)  
         )


userget.uname = 'Имя Фамилия', нужно сначала проверить есть такое имя в тексте, а потом фамилия.
Ругается на использование SUBSTRING_INDEX в Match

пробовал задать параметры в 
select 

@name1 := SUBSTRING_INDEX(userget.uname, " ", -1),
@name2 := SUBSTRING_INDEX(userget.uname, " ", 1)

from 

и подставить в match(@name1) но не помогло.


Подскажите как решить данную проблему?
Ответ:
Так выбери всех подозрительных через быстрый MATCH, а заодно отфильтруй их правильным INSTR.

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

Собственно, дажэ безо всяких не -- именно это будет единственно правильным.
Вопрос: Помогите построить запрос

Задача стоит так в таблице home в 1 столбце "NAME" 2 поля во 2 столбце "id" у каждого присвоено значение "1" и "2". Вопрос как правильно построить запрос что бы выводило отдельно значения 1 поля и 2 поля. Как сделал запрос я :

select name as one
from home h
where h.id=1
union all
select name as two
from home h
where h.id=2

Выводит только ONE, просьба помочь так как в этом деле новичок. Заранее спасибо.
Ответ:
  SELECT 1 AS ID, [fields]
  FROM [tables]
  WHERE [first conditions]
UNION ALL
  SELECT 2      , [fields]
  FROM [tables]
  WHERE [second conditions]
Вопрос: Как правильно построить запрос для графика?

Добрый день всем.
Изначально в базе есть две таблицы - План и Факт. В них заносятся даты и суммы (показал на скрине ниже). То есть, если например, в таблицу план занесено "01.01.2016 - 1000р." и "18.01.2016 - 2000р.", то в целом считаем что на январь 2016 запланировано 3000р. Аналогично устроена и таблица факт.
И вот из данных этих двух таблиц мне нужно построить график соотношения плана и факта по месяцам (картинку желаемого графика прилагаю (нарисовал в экселе)).

Вроде бы и задачка не сложная, но как-то не соображу некоторые моменты, а может я и вообще усложняю и можно как-то сделать проще.
Значит, я рассуждаю так:
1. сначала нужно даты обоих таблиц представить в виде месяцев (с помощью функции Month) и лет (поскольку в таблицах могут быть данные за разные года).
2. затем сгруппировать суммы по месяцам и годам (поскольку и в плане, и в факте могут быть несколько сумм за один месяц).
3. и вот допустим мы имеем два запроса с группировкой, которые представляют помесячные результаты по плану и факту. и как мне их теперь, объединять в итоговом запросе, связывая по полям "Месяц" и "Год"?.. Вроде бы логично получается... Но смущает тот момент, что как в таблице План, так и в таблице Факт может НЕ БЫТЬ данных за какой-нибудь месяц, то есть в группирующем запросе не будет нужного месяца - и соответственно, данные не свяжутся, этот месяц просто выпадет из итогового запроса - и не отобразится на графике. А нужно, чтобы даже если каких-то данных за какой-то месяц нет - все равно чтобы этот месяц присутствовал на графике (с нулями).

Вот на этом моменте я как-то затупил. Были предположения как-то делать еще и отдельную временную таблицу месяцев, и в итоговом запросе подвязывать к ней группирующие запросы?.. Но мне такая идея не очень нравится, т.к. желательно отображать в графике только тот диапазон месяцев, который реально занесен в базе (в базе, которую я создал для примера - с января 2015 по май 2016).

Создал основу базы (таблицы План и Факт), и как всегда буду очень признателен за идеи и советы).
Ответ: shanemac51, Большое спасибо, именно то, что требовалось!)
Вот забываю я зачастую про UNION, как-то не привык им пользоваться, потому и не вспоминаю про него, когда перебираю варианты возможного решения... А ведь очень полезный инструмент, как я уже несколько раз убеждался.
Еще раз очень большое спасибо).
Вопрос: Помогите пожалуйста правильно составить запрос

Есть три таблицы:

select * from jobs;
+--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+
| num_dt | num_sort | status_dt | exchange_dt | name_dt | group_obj_id | obj_id | date_dt | time_dt |
+--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+
| 2 | 1 | работает | 0 | delete_site | 2 | 4 | 2016-09-14 | 01:10:30 |
+--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+

select * from group_obj;
+--------+----------------+----------+
| num_dt | name_dt | table_dt |
+--------+----------------+----------+
| 1 | Сервера | servers |
| 2 | Домены | domains |
| 3 | Темы | thems |
+--------+----------------+----------+

select * from domains;
+--------+------------+-----------+
| num_dt | name_dt | server_id |
+--------+------------+-----------+
| 4 | ramfish.ru | 13 |
| 5 | site-1.ru | 14 |
+--------+------------+-----------+

Мне нужно выбрать сайт ramfish.ru из таблицы domains в подзапросе.
Основной запрос идет в таблицу jobs, потом по полю из этой таблицы group_obj_id в подзапросе получаем поле table_dt (у которого значение domains) и это значение domains послужит значением таблицы для подзапроса который вернет уже поле name_dt (у которого значение ramfish.ru)

Вот я сделал запрос:
select SQL_CALC_FOUND_ROWS num_dt as num_line, (select name_dt from (select table_dt from group_obj where num_dt=t.group_obj_id limit 1) as t1 where num_dt=t.obj_id limit 1) as obj_dt from jobs as t order by num_dt LIMIT 0, 100
но он не работает, выдает Column not found: 1054 Unknown column 't.group_obj_id' in 'where clause''

Помогите пожалуйста правильно составить запрос.
Ответ: Ну и все подзапросы (включая вложенные) должны иметь имена-алиасы. А алиасы таблиц/запросов в именах полей указывать без ошибок.
Вопрос: Помогите, пожалуйста, построить запрос

Добрый день! Есть большая таблица со значениями, и нужно построчно значение столбца S9 перенести в столбец S12, а в S9 поставить 0
Очень буду благодарна за помощь, сама в SQL запросах "полный ноль", с радостью попыталась бы разобраться, но нужно срочно.
Ответ: Alex_Ustinov, Большое спасибо, все получилось!
Вопрос: Как правильно составить запрос

Есть три таблицы:

MySQL
1
2
3
4
5
6
select * from jobs;
+--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+
| num_dt | num_sort | status_dt        | exchange_dt | name_dt     | group_obj_id | obj_id | date_dt    | time_dt  |
+--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+
|      2 |        1 | работает         |           0 | delete_site |            2 |      4 | 2016-09-14 | 01:10:30 |
+--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+
MySQL
1
2
3
4
5
6
7
8
select * from group_obj;
+--------+----------------+----------+
| num_dt | name_dt        | table_dt |
+--------+----------------+----------+
|      1 | Сервера        | servers  |
|      2 | Домены         | domains  |
|      3 | Темы           | thems    |
+--------+----------------+----------+
MySQL
1
2
3
4
5
6
7
select * from domains;
+--------+------------+-----------+
| num_dt | name_dt    | server_id |
+--------+------------+-----------+
|      4 | ramfish.ru |        13 |
|      5 | site-1.ru  |        14 |
+--------+------------+-----------+
Мне нужно выбрать сайт ramfish.ru из таблицы domains в подзапросе.
Основной запрос идет в таблицу jobs, потом по полю из этой таблицы group_obj_id в подзапросе получаем поле table_dt (у которого значение domains) и это значение domains послужит значением таблицы для подзапроса который вернет уже поле name_dt (у которого значение ramfish.ru)

Вот я сделал запрос:
select SQL_CALC_FOUND_ROWS num_dt as num_line, (select name_dt from (select table_dt from group_obj where num_dt=t.group_obj_id limit 1) as t1 where num_dt=t.obj_id limit 1) as obj_dt from jobs as t order by num_dt LIMIT 0, 100
но он не работает, выдает Column not found: 1054 Unknown column 't.group_obj_id' in 'where clause''

Помогите пожалуйста правильно составить запрос.
Ответ: )))
Пробую сделать хранимую функцию:
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DELIMITER $$
CREATE
    FUNCTION `baza`.`object`(group_obj_id INT, obj_id INT) RETURNS VARCHAR(100)
    BEGIN
    DECLARE result VARCHAR(100);
    DECLARE obj_table VARCHAR(100);
    DECLARE query_string VARCHAR(300);
    SELECT table_dt INTO obj_table FROM group_obj WHERE num_dt=group_obj_id;
    SET @query_string := CONCAT('SELECT name_dt INTO result FROM ', obj_table, ' WHERE num_dt=obj_id');
    PREPARE dinamic_query FROM @query_string;
    EXECUTE dinamic_query;
    DEALLOCATE PREPARE dinamic_query;
    RETURN(result);
    END$$
DELIMITER ;
чтоб потом её просто использовать в запросе, но опять же динамические запросы не разрешает делать: "Dynamic SQL is not allowed in stored function or trigger"
Вопрос: Помогите правильно сформировать запрос

Уважаемые знатоки!

Помогите организовать запрос к БД (файл БД SQLite во вложении).

Имеются две таблицы:
1. Список городов
CREATE TABLE `City` (
	`id_City`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
	`CityName`	TEXT NOT NULL
);

2. Список путешественников
CREATE TABLE `Person` (
	`id_Person`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
	`PersonName`	TEXT NOT NULL
);

Для организации связи "много-ко многим" используется промежуточная таблица:
CREATE TABLE `JoinTable` (
	`id_Person`	INTEGER NOT NULL
	`id_City`	INTEGER NOT NULL,
);


Узнать список городов, в которых побывал путешественник id_Person=1 можно выполнив запрос:
SELECT City.CityName
FROM City
INNER JOIN JoinTable
ON City.id_City = JoinTable.id_City
WHERE JoinTable.id_Person = 1;


А теперь вопрос???
Как сформировать запрос, что бы получить список городов в которых путешественник id_Person=1 еще не был?



Вот чем мне нравится этот форум....
Оперативностью, объективностью, грамотностью, краткостью!


К сообщению приложен файл (Travels.db - 8Kb)
Ответ: White Owl, Нет благодарности моей предела!
А то вчера просидели около часа, необходимый результат получили, но только через промежуточную таблицу. Ну а плодить ненужные сущности, это мне не понравилось.
Оказалось все на много проще, век живи, век учись!
Вопрос: Как правильно составить запрос “К серверу”?

Используется
- Access - 2016
- MySql 5.5 x 64
- Odbc - mysql-connector-odbc-5.3.7-winx64
При подключении Access - Odbc - MySql пароль для подключения к базе не используется.
Просто информирую...

Таблица главная
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `00_tbl_00` (
            `id` INT(11) NOT NULL AUTO_INCREMENT,
            `tabl` LONGTEXT NULL,
            `idsub` INT(11) NULL DEFAULT NULL,
            `pol_4` LONGTEXT NULL,
            `pol_5` LONGTEXT NULL,
            `pol_6` LONGTEXT NULL,
            UNIQUE INDEX `id` (`id`)
        )
        COLLATE='utf8_general_ci'
        ENGINE=InnoDB
        AUTO_INCREMENT=32
Таблица подчинённая (подтаблица)

MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE `tbl5` (
            `id` INT(11) NOT NULL AUTO_INCREMENT,
            `tbl` LONGTEXT NULL,
            `idsub` INT(20) NOT NULL,
            `pol_3` INT(11) NULL DEFAULT NULL,
            `pol_4` LONGTEXT NULL,
            `pol_5` LONGTEXT NULL,
            `pol_6` LONGTEXT NULL,
            `pol_7` LONGTEXT NULL,
            `pol_8` LONGTEXT NULL,
            `pol_9` LONGTEXT NULL,
            `pol_10` LONGTEXT NULL,
            `pol_11` LONGTEXT NULL,
            `pol_12` LONGTEXT NULL,
            `pol_13` LONGTEXT NULL,
            `pol_14` LONGTEXT NULL,
            `pol_15` LONGTEXT NULL,
            `pol_16` LONGTEXT NULL,
            `pol_17` LONGTEXT NULL,
            UNIQUE INDEX `id` (`id`)
        )
        COLLATE='utf8_general_ci'
        ENGINE=InnoDB
        AUTO_INCREMENT=240013
В подчинённой таблице тип полей "LONGTEXT" принят как предварительный, для проверки работы базы... Потом полям будут присвоены необходимые типы: LONGTEXT, TEXT, числа, даты и т.д. В полях: pol_9, pol_10, pol_11 используется много строчный текст более 1 000 символов. В остальных полях просто текст "ТЕКСТ _ ЗАПИСИ pol_n"

Запрос к серверу

MySQL
1
2
3
SELECT * 
FROM tbl5 
WHERE idsub =" & [Формы]![03_frm_00_tbl_00]![03_frm_idsub] & ";
Данный запрос возвращает таблицу без записей (см. скрин).


Вопрос
Как правильно прописать запрос "К серверу", чтобы возвращались необходимые данные?

Прилагаю скрины
Ответ:
Сообщение от texnik-san
Можно. Но запросы к таким таблицам выплнять будет аксес, а не сервер. Как результат - будет медленнее.
Кроме того, запрос к присоединенным таблицам - это НЕ "запрос к сереверу", о котором спросил zakaz_77. Мы исхдим из того, что человек знает, что нужен именно "запрос к сереверу".
Ну, это да...Пусть останется просто вариантом..