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

Вопрос такой что такое Overhead  в описании таблиц в MySQL (phpmyadmin) и как он влияет на производительность БД?
Ответ:
Странно...
Вопрос: EXPLAIN - таблицы

Меня сначала заинтересовал вопрос - как быстро получить список используемых в системе индексов (и неиспользуемых тоже). Ответ простой - нужно просмотреть все планы запросов которые используются приложением, включая хранимые процедуры. Это можно сделать довольно просто - создать EXPLAIN - таблицы (.../SQLLIB/MISC/explain.ddl), установить опции компиляции хранимых процедур
db2set DB2_SQLROUTINE_PREPOPTS=EXPLAIN ALL EXPLSNAP ALL
и компилить приложение с использованием опций EXPLAIN ALL EXPLSNAP ALL
в этом случае планы запросов и используемые объекты будут занесецы в таблицы объяснения (EXPLAIN_OBJECT) - откуда легко вытащить используемые объекты. Но теперь возникает вопрос - каким образом они используются. Т.е. как часто происходит например TABLESCAN и пр.
В сущности организация таблиц объяснения расписана в документации (показаны внешние и первичные ключи), но как связать EXPLAIN_OPERATOR и EXPLAIN_OBJECT до меня не доходит...((
может кто-нить этим вопросом занимался?
Ответ: А комментарии к выполнению в духе db2exfmt так (без учёта упомянутого мной фильтра EXPLAIN_TIME ):

select
--  EXPLAIN_REQUESTER ,
--  EXPLAIN_TIME      ,
--  SOURCE_NAME       ,
--  SOURCE_SCHEMA     ,
--  SOURCE_VERSION    ,
--  EXPLAIN_LEVEL     ,
--  STMTNO            ,
--  SECTNO            ,
  OPERATOR_ID       ,
  PREDICATE_ID      ,
  HOW_APPLIED       ,
  WHEN_EVALUATED    ,
  RELOP_TYPE        ,
  SUBQUERY          ,
  FILTER_FACTOR     ,
  RANGE_NUM         ,
  INDEX_COLSEQ      ,
  substr(PREDICATE_TEXT ,1,40)PREDICATE_TEXT
from EXPLAIN_PREDICATE
order by
  OPERATOR_ID       ,
  PREDICATE_ID      
@

select 
--  a.EXPLAIN_REQUESTER,
--  a.EXPLAIN_TIME,
--  a.SOURCE_NAME,
--  a.SOURCE_SCHEMA,
--  a.SOURCE_VERSION,
--  a.EXPLAIN_LEVEL,
--  a.STMTNO,
--  a.SECTNO,
  a.OPERATOR_ID,
  a.ARGUMENT_TYPE,
  a.ARGUMENT_VALUE
from EXPLAIN_ARGUMENT a
order by   a.OPERATOR_ID,
  a.ARGUMENT_TYPE
@

select
--  EXPLAIN_REQUESTER,
--  EXPLAIN_TIME     ,
--  SOURCE_NAME      ,
--  SOURCE_SCHEMA    ,
--  SOURCE_VERSION   ,
--  EXPLAIN_LEVEL    ,
--  STMTNO           ,
--  SECTNO           ,
  substr(OBJECT_SCHEMA,1,10) OBJECT_SCHEMA    ,
  substr(OBJECT_NAME,1,20) OBJECT_NAME      ,
  OBJECT_TYPE      ,
  CREATE_TIME      ,
  STATISTICS_TIME  ,
  COLUMN_COUNT     ,
  ROW_COUNT        ,
  WIDTH            ,
  PAGES            ,
  DISTINCT         ,
  substr(TABLESPACE_NAME  ,1,10) TABLESPACE_NAME,
  OVERHEAD         ,
  TRANSFER_RATE    ,
  PREFETCHSIZE     ,
  EXTENTSIZE       ,
  CLUSTER          ,
  NLEAF            ,
  NLEVELS          ,
  FULLKEYCARD      ,
  OVERFLOW         ,
  FIRSTKEYCARD     ,
  FIRST2KEYCARD    ,
  FIRST3KEYCARD    ,
  FIRST4KEYCARD    ,
  SEQUENTIAL_PAGES ,
  DENSITY          ,
  STATS_SRC        ,
  AVERAGE_SEQUENCE_GAP,
  AVERAGE_SEQUENCE_FETCH_GAP,
  AVERAGE_SEQUENCE_PAGES    ,
  AVERAGE_SEQUENCE_FETCH_PAGES ,
  AVERAGE_RANDOM_PAGES         ,
  AVERAGE_RANDOM_FETCH_PAGES   ,
  NUMRIDS                      ,
  NUMRIDS_DELETED              ,
  NUM_EMPTY_LEAFS              ,
  ACTIVE_BLOCKS                ,
  NUM_DATA_PARTS               ,
  NULLKEYS                     
from EXPLAIN_OBJECT eo
@
Вопрос: Обсуждение переноса данных из таблицы в таблицу

Возник вопрос о целесообразности переноса данных из таблицы в таблицу. Что это нарушает принципы построения реляционных СУБД. Но мне кажется, бывают ситуации, когда это нужно. Делимся своим мнением по тому поводу.


Вот пара задач, с которыми я столкнулся(я не являюсь разработчиком БД, просто помогал знакомым)
В разных СУБД существуют временные таблицы. В аксесе я такого не обнаружил, в связи с чем, использую свой аналог "временной таблицы", а именно отдельная таблица, которую очищаю после использования.

1) У вас есть небольшой интернет магазин. Вы закупаете товар у производителей. У вас есть документ(пусть будет счет-фактура). В счет-фактуре указана большая часть данных для внесения в БД, но не обязательно все( так же многое может быть лишним для вашей БД), но вносить каждое значение вручную(особенно, если большой список наименований) неудобно. Проще сканировать в эксел таблицу, импортировать ее в аксес во "временную таблицу". И перенести нужные данные с добавлением недостающих полей в БД. Потом очистить временную таблицу.
Какие поля могут добавляться? к примеру "производитель" "дата доставки".

Выслушаю варианты решения задачи без использования временной таблицы. (заодно улучшу БД друга)

2) Есть офисы в нескольких(бывает несколько офисов в одном городе[Головной и подчиненные]) городах.
офисы каждый месяц вам присылают экселевские таблицы.
В таблицах содержится информация:
1
плата за городские звонки|плата за межгород|мобильная связь|мобильный интернет|

2
Принтер\мфу|кол-во принтеров\мфу|закупка картриджей(шт)|заправка картриджей(шт)|Восстановление картриджей(шт)

3
операция|монитор|клавиатура+мышь|ноутбук|оперативная память|ПО| и т.д.(перечисляются виды техники)

Существуют следующие виды операций(Обслуживание,ремонт,закупка новой техники,списание)

Есть еще разного типа данные, но думаю этих достаточно для примера.

Соответственно человеку нужно обработать эти данные и внести информацию в БД, в виде

Класс затрат|статья затрат|офис|сумма|сумма с ндс|дата(месяц и год)|примечание

При этом существуют следующие статьи расходов.(указанны не все,только нужные для понимания задачи)

Абонентская плата за стационарные телефоны
Оплата междугородних звонков
Оплата превышения лимита междугородних звонков
Мобильный интернет
Превышение лимита мобильного интернета
Расходные материалы оргтехники
Ремонт техники
Закупка новой техники
Сопровождение техники

Данные из экселя импортируется в "временные" таблицы. Форма берет данные из "временных экселевских" таблиц и высчитывает поля для таблицы в БД.
К примеру форма считает сумму по всем пользователям международных звонков, сравнивает с лимитом(Count(пользователей) в экселевской таблице * на лимит(некое значение в таблице констант(установленный в ЦУ-центральное управление на N-период времени), если это значение больше, то вносится в поле значение лимита, а превышение заносится под статью превышения лимита
В основную таблицу так же добавляются поля (Тип затрат,статья затрат,офис,дата).

Другие таблицы и статьи расходов вычисляются из этих таблиц аналогичным образом.

Так мне кажется реализация, через импорт данных эксел файла в некую "временную таблицу", обработка на форме и внести данные в нужную таблицу в приемлемом виде, с последующей очисткой "временной таблицы" наиболее удобной. Далее загружаем данные из следующего офиса.
Если есть иной вариант, с радость выслушаю.

Указал только данные, необходимые на мой взгляд для понимания задачи, остальное опустил. Поэтому, если что не понятно, уточняйте.
Ответ: почти самой первой задачей в аксесс у меня была стыковка 2-х локальных таблиц М:М (5 и 15 тыс записей)
после уплотнения база занимала 3мб

после 2-3 отладочных запусков --база распухала до 80-100мб и резко замедлялась
пришлось менять алгоритм расчета(первоначально он скопирован из предыдущей системы(ес-1035)

Добавлено через 4 минуты
после смены алгоритма время расчета стало 90 мин на полных таблицах(компы правда слабоваты)
когда пришли более мощные компы время уменьшилось до 1 мин(без переделки кода)
Вопрос: Как правильно организовать БД из 4-х таблиц?

ИСПОЛЬЗУЕТСЯ: Access

Имеется три таблицы:
- 00_tb1;
- 00_tb2;
- 00_tb3;

Данные в таблицы поступают по средствам импорта или ввода
1. Как правильно и грамотно сделать чтобы данные стекались в таблицу "00_tb_4"
2. Как сделать, следующие действия:
- 2.1 -таблицы «00_Tb_2» поля «Tb_2_xar1»
которое соответствует значению «Tb_1_id» из «00_Tb_4»?
- 2.2 Как сделать, чтобы сюда попадало:
- последнее значение из
- таблицы «00_Tb_2» поля «Tb_2_xar2»
которое соответствует значению «Tb_1_id» из «00_Tb_4»?
- 2.3 Как сделать, чтобы сюда попадало:
- количество значение из
- таблицы «00_Tb_2» поля «Tb_2_xar3»
которое соответствует значению «Tb_1_id» из «00_Tb_4»?
3. Как сделать, чтобы во всех таблицах можно было вносить изменения в ячейку таблицы (через таблицу или через форму) и эти изменения отображались во всех таблицах где данная запись отображается?
Ответ: shanemac51,

Что-то я запутался...

Повторюсь
Сама технология (схема работы с БД) следующая.
Схема.
В таблицы:
- Таблица 00_Tb_1,
- Таблица 00_Tb_2,
- Таблица 00_Tb_3,
данные попадают поштучно вводом или массово импортом.

Таблица:
- Таблица 00_Tb_4
формируется из двух таблиц плюс в ней имеется еще три(или более) своих поля (Tb_4_xar1, Tb_4_xar2, Tb_4_xar3) для анализа и сегментации данных.

Вопрос.
Правильно ли я вас понял, что стоит поменять саму логику по технологии формирования БД?
Т.е. продумать результирующую таблицу (Таблица 00_Tb_4) или другую таблицу в которой максимально собирается информация со всех таблиц и импортировать данные в эту таблицу.
А потом данные из результирующей таблицы попадают в
- Таблица 00_Tb_1,
- Таблица 00_Tb_2,
- Таблица 00_Tb_3,
Так?
Вопрос: Сводная таблица

Требуется сверстать таблицу такого вида:



Если исключить поля итогов, то все остальное получается из запроса, генерированного конструктором:

Код SQL
1
2
3
4
5
6
7
8
SELECT [Категория проверяемого клиента].[Категория проверяемого клиента],
 [Сводная таблица].[Наим клиента], [фио сотрудника ПБ назначенный].[ФИО сотрудника ПБ],
 [Сводная таблица].[Дата подготовки]
FROM [Категория проверяемого клиента]
 INNER JOIN ([фио сотрудника ПБ назначенный]
 INNER JOIN [Сводная таблица]
   ON [фио сотрудника ПБ назначенный].Код = [Сводная таблица].[сотрудник ПБ])
   ON [Категория проверяемого клиента].ключ = [Сводная таблица].[Катег пров клиента];
А вот как присоединить итоги? Картинка, показанная наверху, получена при ручной правке. После сохранения она не загружается. Я могу составить запрос, который будет подсчитывать количества дат по строкам или по столбцам. Но на то, чтобы объединить эти запросы с исходным, у меня ума не хватает, т.к. они требуют группировку по различным полям.

Для подсчета по строкам:

Код SQL
1
2
3
4
5
6
7
8
9
10
SELECT [Категория проверяемого клиента].[Категория проверяемого клиента],
 [Сводная таблица].[Наим клиента],
 COUNT([Сводная таблица].[Дата подготовки]) AS [Count-Дата подготовки]
FROM [Категория проверяемого клиента]
 INNER JOIN ([фио сотрудника ПБ назначенный]
 INNER JOIN [Сводная таблица] 
   ON [фио сотрудника ПБ назначенный].Код = [Сводная таблица].[сотрудник ПБ]) 
  ON [Категория проверяемого клиента].ключ = [Сводная таблица].[Катег пров клиента]
GROUP BY [Категория проверяемого клиента].[Категория проверяемого клиента],
 [Сводная таблица].[Наим клиента];
Для подсчета по столбцам:

Код SQL
1
2
3
4
5
6
7
8
SELECT [фио сотрудника ПБ назначенный].[ФИО сотрудника ПБ],
 COUNT([Сводная таблица].[Дата подготовки]) AS [Count-Дата подготовки1]
FROM [Категория проверяемого клиента]
 INNER JOIN ([фио сотрудника ПБ назначенный]
 INNER JOIN [Сводная таблица]
   ON [фио сотрудника ПБ назначенный].Код = [Сводная таблица].[сотрудник ПБ]) 
  ON [Категория проверяемого клиента].ключ = [Сводная таблица].[Катег пров клиента]
GROUP BY [фио сотрудника ПБ назначенный].[ФИО сотрудника ПБ];
Эти запросы также сгенерированы в режиме конструктора и их можно оптимизировать вручную, но вот как их объединить?
Ответ: ksvsvk, думаю, еще нужно посмотреть схему данных. Чтобы один и тот же сотрудник не м.быть инициатором собственной проверки, часть схемы я предлагаю сделать другой. Другую часть я переделывать не стал - не понял назначения некоторых таблиц.
Вопрос: Как грамотно сделать выборку из нескольких таблиц (более 2-х: из 3-х, 4-х, 5-ти и тд.) на приведенном примере?

Здравствуйте!
В MySQL несилен, только недавно приступил к изучению

Имеется три таблицы:

film
id filmname year
1 Фильм1 2006
2 Фильм2 2006
3 Фильм3 2005
Первичный ключ -id

hero
id heroame
1 Имя_Героя_1
2 Имя_Героя_2
3 Имя_Героя_3
Первичный ключ -id

И промежуточная таблица для связки обеих
film_hero
film_id hero_id
1 3
2 1
3 2
Первичный ключ - строка film_id и hero_id , в связке
То есть таблица создавалась запросом
строка 4, PRIMARY KEY: - PRIMARY KEY (film_id, hero_id)

MySQL
1
2
3
4
5
CREATE TABLE film_hero   (
film_id INT NOT NULL,
hero_id INT NOT NULL,
PRIMARY KEY (film_id, hero_id)
) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB
Задача - вывести таблицу, где в левом столбце - название фильма (filmname), а в правом - имя героя (heroame) на основании промежуточной, результирующей, объединяющей таблицы film_hero, связывающей

Я сделал запрос (опытным путём его вывел)
Запрос1
MySQL
1
2
3
select filmname, heroname
from film, hero, film_hero 
where film_id=film.id and hero_id=hero.id
Получил результат

filmname heroame
Фильм1 Имя_Героя_3
Фильм2 Имя_Героя_1
Фильм3 Имя_Героя_2

Вроде все верно

Потом хочу получить Фильм в Котором есть определённая роль Задача2
Если указываю id из hero.id - то вроде все верно показывает

Запрос2
MySQL
1
2
3
select filmname, heroname
from film, hero, film_hero 
where film_id=film.id and hero_id=hero.id and hero.id =3
Вывод
filmname heroame
Фильм1 Имя_Героя_3

Но если мне надо искать именно по имени героя, а не id (так удобнее)

То при запросе

Запрос3
MySQL
1
2
3
select filmname, heroname
from film, hero, film_hero 
where film_id=film.id and hero_id=hero.id and hero.heroname="Имя_Героя_3"
ничего не выводит! - И ошибку не создает

Вопрос:
1.) В Запросе1 я вынужден был использовать костыли- только чего знаю, и у меня ощущение что я через пень колоду запрос вывел, исходя из заданной задачи, и умеючи его можно было другим, более изящным запросом вывести, осуществить, решить задачу, - не подскажете- Каким?
2.) В Запросе 3 - что не так, что неверно? Почему по hero.id из запроса 2 - выводит корректно, что мне надо, а по запросу 3 - пустое поле выдает, ничего.
3.)Я создавая таблицу промежуточную назвал столбцы как film_id и hero_id
3.1)Можно ли их было назвать film.id и hero.id,
Или с точки зрения языка MySQL - это некорректно и вызовет конфликт?
3.2)Если - можно, - то насколько нужно их так назвать
3.3)Как вообще лучше было бы назвать столбцы промежуточной таблицы film_hero.

Спасибо!
Буду благодарен если ответите на все 5 вопросов
Ответ:
Сообщение от Joeymax
Он выдает нужный тебе результат Ниже скрипт использованный для проверки и скрин результата его выполнения
Спасибо большое, Joemax!
Честно скажу - есть незнакомые команды
Буду разбираться
Если не получиться самому разобраться - то задам вопрос
Спасибо большое!
Интересно

Буду изучать

А вообще, в последних двух Командах Вашего запроса - насколько актуально Применение оператора Join?
Я с ним ещё пока плохо разбираюсь, буду изучать.
То есть я к тому, что по идее нужное мне (результат)
Где Фильм_1-> Имя_Героя_3
Выводится (ну, то есть можно вывести)
командами select
from
where (3 условия Where, усл1,усл2 and усл3)

без использования оператора join,
т.е. вместо
select
from
join on
join on
where

можно
select
from
where

С тем же результатом,

Честно скажу - я именно поэтому и не использовал оператор Join так как слышал о нем но плохо пока его понимаю), поэтому изгалялся, чтобы обойти , используя только мне известные - select, from, where)))
Поэтому хочется понять насколько необходим Join(насколько оправдано) (его использование) в данном случае чтоб его изучить, поскольку и везде в литературе, в форуме, темах, он часто используеся.
(Т.е. опциональность - или необходимость в данном случае, в данном примере для решения этой задачи: Т.е он необходим - для решения моей вот этой задачи, или опционален - можно использовать а можно и нет).
Просто мне кажется более легким обойти его Для этой задачи что в моей теме, и использовать только select, from, where

И второе - может Этому (не использовать Join, а только select, from, where) помогает использование Промежуточной таблицы, где Нет id а первичный ключ - это оба столбца (одна строка с уникальным сочетанием). Четно скажу - эту таблицу я вычитал (промежуточную) и решил применить для своих нужд, и нашел её изящным решением (она мне показалась)

Спасибо)

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

Насколько оправдано использование промежуточных таблиц, связывающих как в этом примере - создание таблицы 3, связывающей) для решения задач указанных в топике - для облегчения создания выборки из более чем двух таблиц - 3-, 5-ти, 4-х - и так далее. .

И как лучше Называть, столбцы промежуточных таблиц (как принято?)
Спасибо
Вопрос: Как сделать выпадающий список в Access в подключённой таблице из MySql?

ВОПРОС:
Как сделать выпадающий список в Access в подключённой таблице из MySql?
Какой должна быть талица справочника: столбцы(тип) - ? штук.
Где должен (или целесообразно) разместить справочник: в таблице справочнике Access или в отдельной подключённой таблице справочнике из MySql?
Существую ли другие более грамотные способы реализации данной задачи?

ТРЕБУЕТСЯ:
Сделать выпадающий список в Access в подключённой таблице из MySql.
Характеристики выпадающего списка:
- кол. поз. < 10штук
- содержание: ВЫП СПС ПОЗ.1, ВЫП СПС ПОЗ.2, ВЫП СПС ПОЗ.3,... ВЫП СПС ПОЗ.10
Данные в выпадающий список должны попадать из:
- таблица справочник Access - Таблица справочник №1(см. скриншот);
или
- подключённая таблица справочник из MySql - Таблица справочник №2(см. скриншот);
по наиболее целесообразному сценарию.

УСТАНОВЛЕНО:
- КОМП 1
- установлен MySql с центральной БД.
- В базе данных (БД) имеется Таблица_1 со следующими столбцами:


- КОМП 2
- Access подключается через ODBC как клиент к БД MySql.


ТЕРМИНЫ:
- таблица справочник Access - Таблица справочник №1(см. скриншот);
- подключённая таблица справочник из MySql - Таблица справочник №2(см. скриншот);
- подключённая таблица из MySql - Таблица БД клиент (см. скриншот);
Ответ: Да вам что с нуля форму строить, что мой пример разбирать - по времени будет одинаково.

В панели переходов выделите основную таблицу. На ленте "создание" выберите кнопку "форма". Мастер создаст вам форму со всем полями вашей таблицы.

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

Щелкаете на этом поле правой кнопкой мышки и выбираете пункт "преобразовать поле в" - "поле со списком"

В получившемся поле со списком меняем свойстваа:
Источник данных - тут пишем имя таблицы или имя запроса или текст запроса
Привязанный столбец - там стоит 1, обычно так и надо (это номер столбца с иденификатором или кодом, если он у вас не 1й - можно или в запросе поменять порядок, или номер привязанного столбца исправить)
Число столбцов - как правило, 2, но может быть и больше, если надо
Ширина столбцов - обычно пишут 0;ШиринаКотораяНужна или просто 0 - тогда столбец с кодом не виден на экране, видны только значения. Если у вас другое чсило столбцов или другой порядок - ширины менются соответственно.

Ну и собственно все. Полем можно пользоваться.

Добавлено через 6 минут
Сообщение от texnik-san
для аксес присоединеные таблицы во многих случаях неотличимы от локальных
Собственно, поэтому и нет никакиз внятных причин, почему бы не харнить все таблицы в одной общей базе. По удобству разработка все равно будет одинакова. А в эксплуатации общая база от многих глупых ситуаций вас защитит.

Например, Вася случайно залез в справочник и стер там все значения (система позволила, спавочник-то локальный). Потом испугался, что будут ругать, и никому ничего не сказа, просто сел и набил все значения заново. Текст со старым совпадает. А что ключи разные - так Вася ж этого не знает. Потом начинается "Я выбрал то же, что и всегда выбирал, а программа пишет ошибку "нет такого значения в связанной таблице"". Думаете, так не бывает? Лично на такие грабли наступала

Добавлено через 1 минуту
Так что если есть возможность сделать все в одной базе и настроить ограничения внешних ключей, обеспечивающие целостность - этот вариант предпочтительный,
Вопрос: Объединение и суммирование таблиц SQL

Нужна помощь.
Таблица Material с полями Naimenovanie, Kol, Cena_bez_NDS, Ed_izm
Таблица Zakaz2 с полями Naimenovanie, Kol
Наименование(Naimenovanie) в двух таблицах повторяется. Нужно сгруппировать по наименованию(Naimenovanie) и суммировать все строки количества(kol), которые соответствуют наименованию. Тоже самое с таблицей Zakaz2.
Пример:
таблица Material
наименование_1 500
наименование_1 100
Таблица Zakaz2
Наименование_1 2
Наименование_1 3
---------------------
Вывод: наименование_1 600 Наименование_1 5
Тоже самое с таблицей Zakaz2. Объединить две эти таблицы.

SQL
1
2
3
4
5
6
7
8
9
10
SELECT
Material.Naimenovanie, Zakaz2.Naimenovanie,
 SUM(Material.Kol) AS Kol,
 MAX(Material.Cena_bez_NDS) AS Cena_bez_NDS,
 MAX(Material.Ed_izm) AS Ed_izm,
 SUM(Zakaz2.Kol) AS Kol
FROM Material LEFT OUTER JOIN Zakaz2
ON Material.Naimenovanie = Zakaz2.Naimenovanie
GROUP BY Material.Naimenovanie,Zakaz2.Naimenovanie
ORDER BY 1
Этот код работает, но он почему-то суммирует количество и умножает на количество одинаковых наименований, которые находятся в таблице Zakaz2(Material).
Пример:
таблица Material
наименование_1 500
наименование_1 100
Таблица Zakaz2
Наименование_1 2
Наименование_1 3
--------------------
Выводит: Наименование_1 1200 Наименование_1 10
Ответ: Capsed, если у тебя в таблице Material записи не уникальны, то запрос создаёт все возможные комбинации для первой таблицы используя лишь равенство полей наименования, надо чтобы в первой таблице значения были уникальны, и для неё же просто вывести значение из столбца kol, тогда твой запрос должен нормально работать.
И в селекте зачем тебе два столбца с одинаковым значением, достаточно вывести из первой таблицы, всё равно в условии они у тебя равны, и группировать тоже по первой (уникальной) таблице.

Добавлено через 29 минут
Может так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
Material.Naimenovanie,
 Material.Koll AS Koll,
 Material.Cena_bez_NDS AS Cena_bez_NDS,
 Material.Ed_izm AS Ed_izm,
 SUM(Zakaz2.Kol) AS Kol
FROM (SELECT Naimenovanie,
MAX(Cena_bez_NDS) AS Cena_bez_NDS,
 MAX(Ed_izm) AS Ed_izm,
SUM(Kol) AS Koll
FROM Material 
GROUP BY Naimenovanie) AS
Material LEFT OUTER JOIN Zakaz2
ON Material.Naimenovanie = Zakaz2.Naimenovanie
GROUP BY Material.Naimenovanie
Вопрос: Временная таблица и ее апдейт

Здравствуйте!
Есть таблица параметров main_table, которая формируется процедурой test. Внутри процедуры мы создаем временную таблицу tab_main_tmp, заполняем ее данными из других таблиц базы данных. К примеру мы берем данные из 3х таблиц.
Кусок кода процедуры test:
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- создаем временную таблицу
create temporary table if not exists tab_main_tmp 
(
North1_T_pod1 DECIMAL(18,2) NULL,
North1_T_obr1 DECIMAL(18,2) NULL,
North1_T_pod2 DECIMAL(18,2) NULL,
North1_T_obr2 DECIMAL(18,2) NULL,
North1_T_pod3 DECIMAL(18,2) NULL,
North1_T_obr3 DECIMAL(18,2) NULL
)
 
-- Добавляем записи во временную таблицу
insert into tab_main_tmp 
(
North1_T_pod1,  
North1_T_obr1  
)
 
SELECT 
T_pod, T_obr
from db.sever1 order by RowID desc limit 1;
А как поступить с добавлением записей из других таблиц? Я понимаю, что там уже будет не insert, а update. Insert добавит новую строку и потеряет данные предыдущей таблицы. А мы все данные из трех таблиц формируем в одной строке.

был вариант использовать такой запрос:

MySQL
1
2
3
update tab_main_tmp 
set North1_T_pod2 = (select T_pod from sever11 order by RowID desc limit 1),  
North1_T_obr2 = (select T_obr from sever11 order by RowID desc limit 1)
Хотелось бы упростить такой запрос, потому что при увеличении числа полей таблицы надо ручками все это делать... А лень - мать прогресса

В MS SQL возможно организовать запрос такой (в том смысле что взять запрос за основу, но с учетом синтаксиса MySQL):
SQL
1
2
3
UPDATE #tab_main_tmp
SET M1 = a.M1, M2 = a.M2, WTV = a.WTV
FROM(SELECT top 1 M1, M2, WTV FROM [20_1_1_1] ORDER BY RowID DESC) AS a WHERE #tab_main_tmp.ID = 1
Но в MySQL он не прокатывает.
Ответ: во временной таблице всегда только одна строка. и она заполняется данными из других таблиц. после заполнения на основании временной таблицы формируется основная таблица, так же только с одной строкой. и с каждым новым запуском процедуры данные из временной и основной таблиц стираются полностью и по новой заполняются. получается некий цикл: заполнил - отдал - стёрся.

по поводу шо с остальными записями из таблицы sever11 делать.
мне и надо брать все время только первую (она же самая поздняя по записи строка) и с ней работать. остальные строки идут как история и не используются.

за ночь я придумал вот такой вариант заполнения:
MySQL
1
2
3
4
update tab_main_tmp, sever11
set tab_main_tmp.North1_T_pod = sever11.T_pod,   
tab_main_tmp.North1_T_obr = sever11.T_obr
where RowID=(select max(RowID) from sever11);
теперь только остается узнать, какой запрос быстрее по времени будет выполняться. я все-таки смотрю больше в сторону вами предложенного запроса

MySQL
1
2
UPDATE tab_main_tmp t , (SELECT * FROM sever11 s ORDER BY RowID DESC LIMIT 1) s
SET  t.North1_T_pod2 = s.T_pod, t.North1_T_obr2  = s.T_obr
только условие по полю id мне не потребуется
Вопрос: Правильность заполнения полей таблиц. Как правильнее их заполнить

то ли я что-то намудрила... то ли не пойму, что делать дальше..нужна помощь редкостному чайнику
было следующее задание:

У міськводоканалі ведеться БД “Водопостачання” для обліку щомісячної сплати за постачання холодної та послуги каналізації.
До БД входять таблиці:
тКвартири(Код квартири, Квартира, План, Площа);
тОплата факт (Код оплати факт, Дата оплати, Оплачено);
тОплата план(Код оплати план, Рік,Місяць, Кількість мешканців, Нараховано);
тБудинки(Код будинку,Адреса);
тТарифи (Код тарифу, Дата встановлення, Тарифік1люд).
Визначити відсоток заборгованості по квартирі та будинку за звітне півріччя




Ну и я начала действовать часть текста из моей работы)
Для большей практичности, дополним или немного изменим существующие таблицы:
• в таблице тБудинки видоизменим столбец Адреса на столбец №будинку и №квартири;
• в таблицу тКвартири добавим столбец Кількість_мешканців;
• в таблице тОплата_план Рік,місяць считаем как один столбец( графу) с датой;
• добавим таблицу тМешканці( в которой будут содержаться более раскрытые данные о жителях квартиры);


Отношения между этими объектами могут быть определены простыми терминами:
тДома к тКвартиры:В доме может быть одна или несколько квартир(1 ко многим);
тКвартири к тМешканці: в каждой квартире может быть, проживать(быть прописанным) один или несколько жителей(1 ко многим);
тТарифи к тОплата_план: начисленная сумма (оплата по плану) зависит от количества жителей в квартире и установленного тарифа,т.е. один действует тариф на несколько квартир и возникает несколько планируемых оплат(1 ко многим);
тОплата_план к тКвартири: каждой квартире соответствует одна оплата водоснабжения по установленному тарифу (1 ко многим);
тОплата_факт к тКвартири: по каждой квартире в доме совершается только один платеж по оплате водоснабжения (тОплата_факт)( 1 ко многим);


Работала как препод сказала - в erwin. создала связи между таблицами. она не сказала что не правильно - а сказала что делай дальше. при помощи sql запросов в access творить значит надо далее все.. сделала по созданному коду в erwin таблицы.. и пару запросов создала на заполнение полей таблицы.. и тут возник ступор.. запуталась как делать - заполнять поля дальше..

вот, допустим, если дан только один дом и несколько квартир в нем..
КАК правильно сформулировать запрос, чтоб код_будинку, №квартири передавался соответственно из таблицы тБудинки в тКвартири ???при помощи select в запросах как-то??чего-то запуталась, хотя наверное все не так сложно как кажется...

мои наработки все в архивчике... плииз , подскажите что и как здесь лучше сделать, чтоб все таблички были заполненны для начала..
Ответ: правильно ли я делаю запрос, чтоб данные для таблицы тКвартири(№квартири, код_будинку)
передались из тБудинки??
Код SQL
1
2
3
INSERT INTO тКвартири(№квартири, код_будинку) 
SELECT * 
FROM тБудинки;
выбивает следующую ошибку на картинке. и не пойму почему - каких-то данных в запросе не хватает???