Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Создание таблицы, используя данные других таблиц  [new]
r12
Member

Откуда:
Сообщений: 63
Здравствуйте, нужна помощь:

есть 3 таблицы
EVENTS (отсюда беру время прохода)
EMP (отсюда беру ФИО того, кто прошел)
READER (отсюда беру вход или выход и куда вошел)

Для примера запрос:

SELECT      EVENTS.EVENTIME, EMP.LASTNAME+' '+EMP.FIRSTNAME+' '+EMP.MIDNAME, READER.NAMES, READER.enter_exit
FROM         READER INNER JOIN
                      EVENTS ON READER.PANELID = EVENTS.MACHINE AND READER.READERID = EVENTS.DEVID INNER JOIN
                      EMP ON EVENTS.EMPID = EMP.ID
ORDER BY EVENTS.EVENTIME DESC

Данные все получаю

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

таблицу и вставку делаю так:
use test2
go
create table dbo.TEST (
[EVENTIME] [datetime] NULL,
[LASTNAME] [nvarchar](192) NOT NULL,
[NAMES] [nvarchar](30) NULL,
[enter_exit] [nvarchar](7) NULL)
go

insert into dbo.TEST
SELECT      EVENTS.EVENTIME, EMP.LASTNAME+' '+EMP.FIRSTNAME+' '+EMP.MIDNAME, READER.NAMES, READER.enter_exit
FROM         READER INNER JOIN
                      EVENTS ON READER.PANELID = EVENTS.MACHINE AND READER.READERID = EVENTS.DEVID INNER JOIN
                      EMP ON EVENTS.EMPID = EMP.ID
ORDER BY EVENTS.EVENTIME DESC[src]

Но заполняется она только один раз при создание, потом дополнить можно только запустив в ручную insert ….. и данные которые уже были записываются повторно.....
В SQL новичок.....
30 июл 09, 16:12    [7480180]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104760
r12


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

А что должно будет происходить с данными этой сводной таблицы при удалении или изменении данных в этих трех таблицах ?
30 июл 09, 16:14    [7480198]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
r12
Member

Откуда:
Сообщений: 63
Glory,

тоже что и с исходными 3 таблицами - данные должны удаляться или меняться
30 июл 09, 16:17    [7480221]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а зачем вы это хотите сделать?

для спящего время бодрствования равносильно сну
30 июл 09, 16:30    [7480307]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104760
r12
Glory,

тоже что и с исходными 3 таблицами - данные должны удаляться или меняться

Тогда лучше view, имхо
30 июл 09, 16:31    [7480313]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
r12
Member

Откуда:
Сообщений: 63
Алексей2003,

Воообще хочу сделать что то вроде учета рабочего времени, но так как все данные в разных таблицах (около 8 таблиц), не могу написать все условия отбора данных. Где то здесь на форуме прочитал что лучше всего иметь одну таблицу - проще будет строить запрос.....
Пока у меня проблема в определении времени начала рабочего дня и конца рабочего дня.
Там должно быть условие MIN время и действие вход, также надо выбрать MAX время и действие выход - а эти данные (время и действие) у меня в разных таблицах. Могу только выбрать Max и Min время, без условий входа-выхода

Код запрос нашел:
https://www.sql.ru/forum/actualthread.aspx?tid=232676&hl=%f3%f7%e5%f2+%f0%e0%e1%ee%f7%e5%e3%ee+%e2%f0%e5%ec%e5%ed%e8[url=]

Второе сообщение (пользователь Roman S. Golubin)
По отдельности выбрать могу: отдельно Min и вход и отдельным запросом Max и выход,
а вот объединить не могу..........
А у Roman S. Golubin получилось - НО там все в одной таблице. Вот я и захотел тоже все склеить в одну таблицу.
30 июл 09, 16:46    [7480447]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2r12
union all и все в одной выборке.

для спящего время бодрствования равносильно сну
30 июл 09, 16:53    [7480496]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
r12
Member

Откуда:
Сообщений: 63
Glory,

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

Если что, за такие вопросы извиняйте, я в этом деле новичок, как правильно делать не знаю, поэтому и выдумываю разные способы :)
30 июл 09, 16:54    [7480509]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104760
r12
Glory,

view может не подойти, я потом
А из view данные выбираются так же быстро как и из таблицы?

В общем случае нет, не так же быстро.Неиндексированные view-ы - это всего лишь тексты запросов.

r12
Glory,
А если сделать к примеру два view: первое там только вход будет, а во втором будет только выход, а потом из выхода вычесть вход получить отработанное время и записать его в третье view. Это будет долго работать?

Слишком общий вопрос. В чем мерять "долгость работы" ?
30 июл 09, 17:10    [7480623]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
r12
Member

Откуда:
Сообщений: 63
Алексей2003,

Выбор Min времени и действие вход (READER.TIMEATT = 1)

SELECT     CONVERT(varchar(10), MIN(EVENTS.EVENTIME), 104) AS Дата, CONVERT(varchar(10), MIN(EVENTS.EVENTIME), 108) AS Приход, 
                      EMP.LASTNAME AS Фамилия, EMP.FIRSTNAME AS Имя, READER.TIMEATT AS Приход01, EVENTS.CARDNUM
FROM         EVENTS INNER JOIN
                      EMP ON EVENTS.EMPID = EMP.ID INNER JOIN
                      READER ON EVENTS.DEVID = READER.READERID AND EVENTS.MACHINE = READER.PANELID
GROUP BY EVENTS.CARDNUM, EMP.LASTNAME, DATEDIFF(dd, 0, EVENTS.EVENTIME), EMP.FIRSTNAME, READER.TIMEATT
HAVING      (EMP.LASTNAME = N'Иванов') AND (READER.TIMEATT = 1)
ORDER BY EMP.LASTNAME, MIN(EVENTS.EVENTIME) DESC

тоже самое для Max времени и действия выход (READER.TIMEATT = 2)

SELECT     CONVERT(varchar(10), Max(EVENTS.EVENTIME), 104) AS Дата, CONVERT(varchar(10), max(EVENTS.EVENTIME), 108) AS Приход, 
                      EMP.LASTNAME AS Фамилия, EMP.FIRSTNAME AS Имя, READER.TIMEATT AS Приход01, EVENTS.CARDNUM
FROM         EVENTS INNER JOIN
                      EMP ON EVENTS.EMPID = EMP.ID INNER JOIN
                      READER ON EVENTS.DEVID = READER.READERID AND EVENTS.MACHINE = READER.PANELID
GROUP BY EVENTS.CARDNUM, EMP.LASTNAME, DATEDIFF(dd, 0, EVENTS.EVENTIME), EMP.FIRSTNAME, READER.TIMEATT
HAVING      (EMP.LASTNAME = N'Иванов') AND (READER.TIMEATT = 2)
ORDER BY EMP.LASTNAME, max(EVENTS.EVENTIME) DESC

а вот как это объединить .......

у меня заработало только так:
SELECT	CONVERT(varchar(10), MIN(EVENTS.EVENTIME), 104) AS Дата, 
		CONVERT(varchar(10), MAX(EVENTS.EVENTIME), 104) AS Дата2, 
		CONVERT(varchar(10), MIN(EVENTS.EVENTIME), 108) AS Приход, 
		CONVERT(varchar(10), MAX(EVENTS.EVENTIME), 108) AS Уход, 
		EMP.LASTNAME AS Фамилия, 
		EMP.FIRSTNAME AS Имя, 
		CONVERT(varchar(10), MAX(EVENTS.EVENTIME) - MIN(EVENTS.EVENTIME), 108) AS Отработано, 
		MIN(READER.TIMEATT) AS Приход01, 
		MAX(READER.TIMEATT) AS Уход01, 
		EVENTS.CARDNUM

FROM         EVENTS INNER JOIN
             EMP ON EVENTS.EMPID = EMP.ID INNER JOIN
             READER ON EVENTS.DEVID = READER.READERID AND EVENTS.MACHINE = READER.PANELID

GROUP BY EVENTS.CARDNUM, EMP.LASTNAME, DATEDIFF(dd, 0, EVENTS.EVENTIME), EMP.FIRSTNAME

HAVING      (EMP.LASTNAME = N'Иванов')

ORDER BY EMP.LASTNAME, CONVERT(datetime, MAX(EVENTS.EVENTIME), 108) DESC, MIN(EVENTS.EVENTIME) DESC

Но тут не учитывается вход или выход. Бывает что человек ушел в 00:15 а пришел в 10:15 и ушел в 16:15 - а при выборке sql говорит что человек пришел в 00:15 и ушел 16:15, и считает это рабочим временем.....

я так понимаю надо что то типа
Where EVENTS.EVENTIME=MAX(EVENTS.EVENTIME) and READER.TIMEATT = 2 or  EVENTS.EVENTIME=MIN(EVENTS.EVENTIME) and READER.TIMEATT = 1
но только как это все в один запрос объединить я не знаю...
30 июл 09, 17:15    [7480649]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
r12
Member

Откуда:
Сообщений: 63
Glory

Слишком общий вопрос. В чем мерять "долгость работы" ?

"долгость работы" мереть в секундах, что бы при запросе пользователь не ждал и не нервничал :)
а там получается около 148199 событий...
30 июл 09, 17:18    [7480673]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104760
r12
Glory

Слишком общий вопрос. В чем мерять "долгость работы" ?

"долгость работы" мереть в секундах, что бы при запросе пользователь не ждал и не нервничал :)
а там получается около 148199 событий...

Т.е. мы будем сравнивать мои стомиллионов записей на 8ми процессорном 64битном сервере с сан-массивом и 64гб памяти с вашим миллионом записей на однопроцессорной машине с идедиском и 1гб памяти ? И время произвольного запроса должно быть одинаковым ?
30 июл 09, 17:22    [7480715]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
r12
Member

Откуда:
Сообщений: 63
Glory,
Ну в общем то почти все верно :), 2 гига памяти, процессор AMD x2 (2300), жесткий (один) sata,
31 июл 09, 08:01    [7482426]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы, используя данные других таблиц  [new]
vino
Member

Откуда:
Сообщений: 1191
r12
Здравствуйте, нужна помощь:
есть 3 таблицы
EVENTS (отсюда беру время прохода)
EMP (отсюда беру ФИО того, кто прошел)
READER (отсюда беру вход или выход и куда вошел)...

Вам сначала надо выложить примеры таблиц, чтобы стали понятны возможные ситуации. А то от ваших селектов толку не будет, раз вы задаете вопросы вроде этого
r12
...Но тут не учитывается вход или выход. Бывает что человек ушел в 00:15 а пришел в 10:15 и ушел в 16:15 - а при выборке sql говорит что человек пришел в 00:15 и ушел 16:15, и считает это рабочим временем.....

я так понимаю надо что то типа

Where EVENTS.EVENTIME=MAX(EVENTS.EVENTIME) and READER.TIMEATT = 2 or  EVENTS.EVENTIME=MIN(EVENTS.EVENTIME) and READER.TIMEATT = 1
но только как это все в один запрос объединить я не знаю...
31 июл 09, 13:00    [7484122]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить