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

Откуда:
Сообщений: 127
Вопрос состоит в следующем: Не могу понять в чем допустил ошибку при написании SELECT
Когда строка в таблице не имеет повторений в столбцах Branch1 и Branch2 то все селектит правильно, но как только появляются записи в таблице в которой Branch 1 и Branch2 повторяются, но отличаются даты DateFrom и DateTo то эти записи перемножаются.
Думается что нужно добавить еще какую-то связь между таблицами но не могу понять что и с чем связать.

SELECT Users.LastName, Users.FirstName, Users.MiddleName,Branch1.[Description],Result.DateFrom ,Branch2.[Description],Result.DateTo, Operations.OperationsName,Result.Zayavka,Result.[Date]
FROM Result, Users, Operations,Branch1,Branch2
WHERE Result.[User]=Users.[KEY] and Branch1.BKEY1=Result.Branch1 and Branch2.BKEY2=Result.Branch2 and Result.Operation=Operations.[KEY] and Result.Operation=2 
ORDER BY Result.[Date] DESC


Скрин View если поможет:

Картинка с другого сайта.
12 сен 12, 17:06    [13153255]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
https://www.sql.ru/forum/actualthread.aspx?tid=127456
п.6
12 сен 12, 17:13    [13153311]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dandy777
но как только появляются записи в таблице в которой Branch 1 и Branch2 повторяются, но отличаются даты DateFrom и DateTo то эти записи перемножаются.

А что вы назваете "перемножением" ?
И что по-вашему должно происходить с повторяющимися Branch 1 и Branch2 ?
12 сен 12, 17:15    [13153323]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
Допустим

запись 1:

Пользователь Отделение1 дата1 отделение 2 дата 2
Пупкин Киев1 12.09.2012 Киев2 15.09.2012

Такая запись выбирается нормально, но сил будет добавлена еще такая запись

Пользователь Отделение1 дата1 отделение 2 дата 2
Пупкин Киев1 07.09.2012 Киев2 20.10.2012


То в SELECT почему-то выводится 8 строк.
12 сен 12, 17:20    [13153365]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dandy777
То в SELECT почему-то выводится 8 строк.

И почему вы уверены, что это именно из-за Branch 1 и Branch2 ?
12 сен 12, 17:24    [13153393]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
Касательно предыдущего сообщения предоставить данные не смогу, попробую в кратце описать работу.

Таблицы Branch, Users, Operations хранят постоянную информацию которая изредка пополняется.

в таблицу Result заносятся KEY поля из 3-х предыдущих таблиц за исключением полей DateFrom, DateTo,Date , Zayavka

P.S. Таблицы создавал вручную посему код создания таблицы предоставить не могу.
12 сен 12, 17:25    [13153404]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
Glory
Dandy777
То в SELECT почему-то выводится 8 строк.

И почему вы уверены, что это именно из-за Branch 1 и Branch2 ?


Не уверен, но догадываюсь, так как если из SELECT убрать 2 VIEW и не выбирать данные поля то все проходит на ура.
12 сен 12, 17:26    [13153410]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dandy777
Касательно предыдущего сообщения предоставить данные не смогу, попробую в кратце описать работу.

И как это поможет по-вашему ?

Dandy777
P.S. Таблицы создавал вручную посему код создания таблицы предоставить не могу.

А утилитой пользоваться не умею.
12 сен 12, 17:28    [13153416]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dandy777
Не уверен, но догадываюсь, так как если из SELECT убрать 2 VIEW и не выбирать данные поля то все проходит на ура.

Что убрать ?
12 сен 12, 17:28    [13153420]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
Glory
А утилитой пользоваться не умею.


Вы будете, смеяться но нет :( Чуть более месяца изучаю SQL + Delphi
12 сен 12, 17:29    [13153425]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dandy777
Вы будете, смеяться но нет :

Изучите контекстное меню при нажатии правой кнопки мыши на выбранном объекте
12 сен 12, 17:31    [13153437]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
Glory
Dandy777
Не уверен, но догадываюсь, так как если из SELECT убрать 2 VIEW и не выбирать данные поля то все проходит на ура.

Что убрать ?


Branch1 и Branch2 это View, так как в таблице Result хранятся ключевые поля отделений, а в SELECT мне надо вывести их названия. Пока получилось организовать через View.
В Delphi это организовывалось через Lookup Field.
12 сен 12, 17:33    [13153455]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
Dandy777,
ок. Я, кажется, понял, что ты пытаешься в запросе получить. Сейчас пример накатаю, а ты почитай пока про оператор SELECT и как таблицы связывать )
12 сен 12, 17:34    [13153462]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dandy777
Branch1 и Branch2 это View, так как в таблице Result хранятся ключевые поля отделений, а в SELECT мне надо вывести их названия. Пока получилось организовать через View.

В вашем запросе 5 таблиц
Почему вы решили, что проблема именно в Branch1 и Branch2 ?
12 сен 12, 17:35    [13153467]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
+
USE [PlatSys]
GO

/****** Object:  Table [dbo].[Result]    Script Date: 12.09.2012 16:35:11 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Result](
	[KEY] [int] IDENTITY(1,1) NOT NULL,
	[User] [int] NOT NULL,
	[Branch] [int] NULL,
	[Branch1] [int] NULL,
	[Branch2] [int] NULL,
	[DateFrom] [date] NULL,
	[DateTo] [date] NULL,
	[Operation] [int] NOT NULL,
	[Date] [date] NOT NULL,
	[Zayavka] [nchar](17) NOT NULL,
 CONSTRAINT [PK_Result] PRIMARY KEY CLUSTERED 
(
	[KEY] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Result] ADD  CONSTRAINT [DF_Result_Date]  DEFAULT (getdate()) FOR [Date]
GO

ALTER TABLE [dbo].[Result]  WITH CHECK ADD  CONSTRAINT [FK_Result_Branch] FOREIGN KEY([Branch])
REFERENCES [dbo].[Branch] ([KEY])
GO

ALTER TABLE [dbo].[Result] CHECK CONSTRAINT [FK_Result_Branch]
GO

ALTER TABLE [dbo].[Result]  WITH CHECK ADD  CONSTRAINT [FK_Result_Branch1] FOREIGN KEY([Branch1])
REFERENCES [dbo].[Branch] ([KEY])
GO

ALTER TABLE [dbo].[Result] CHECK CONSTRAINT [FK_Result_Branch1]
GO

ALTER TABLE [dbo].[Result]  WITH CHECK ADD  CONSTRAINT [FK_Result_Branch2] FOREIGN KEY([Branch2])
REFERENCES [dbo].[Branch] ([KEY])
GO

ALTER TABLE [dbo].[Result] CHECK CONSTRAINT [FK_Result_Branch2]
GO

ALTER TABLE [dbo].[Result]  WITH CHECK ADD  CONSTRAINT [FK_Result_Operations] FOREIGN KEY([Operation])
REFERENCES [dbo].[Operations] ([KEY])
GO

ALTER TABLE [dbo].[Result] CHECK CONSTRAINT [FK_Result_Operations]
GO

ALTER TABLE [dbo].[Result]  WITH CHECK ADD  CONSTRAINT [FK_Result_Users] FOREIGN KEY([User])
REFERENCES [dbo].[Users] ([KEY])
GO

ALTER TABLE [dbo].[Result] CHECK CONSTRAINT [FK_Result_Users]
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Отделение откуда переводится пользователь.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Result', @level2type=N'COLUMN',@level2name=N'Branch1'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Отделение куда переводится пользователь.' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Result', @level2type=N'COLUMN',@level2name=N'Branch2'
GO


Это то что имелось ввиду?
12 сен 12, 17:39    [13153492]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
Glory Я написал чуть выше, что если это убрать из запроса то всё выбирает нормально.
12 сен 12, 17:39    [13153499]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dandy777
Glory Я написал чуть выше, что если это убрать из запроса то всё выбирает нормально.

Офигительное объяснение
А _другие_ таблицы вы пробовали убрать ?
12 сен 12, 17:41    [13153506]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
Glory
Dandy777
Glory Я написал чуть выше, что если это убрать из запроса то всё выбирает нормально.

Офигительное объяснение
А _другие_ таблицы вы пробовали убрать ?


Нет, сейчас попробую. Просто вы повторяли один и тот же вопрос без комментариев, я думал что Вы не видели моего ответа. Я и повторил.
12 сен 12, 17:45    [13153534]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
Glory Пробовал поочередно убирать другие таблицы - результат не менялся.
12 сен 12, 17:50    [13153570]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Dandy777
Glory Пробовал поочередно убирать другие таблицы - результат не менялся.

Да не убирать надо по-очередно
А добавлять
Сначала Result,
Потом Result+Branch1
Потом Result+Branch2
Потом Result+Branch1+Branch2
12 сен 12, 17:51    [13153592]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
Dandy777,

declare @Branch1 table (
	[BKEY1]					int
	,[Description]	varchar(max)
);

declare @Branch2 table (
	[BKEY2]					int
	,[Description]	varchar(max)
);

declare @Users table (
	[KEY]						int
	,[FirstName]		varchar(max)
	,[MiddleName]		varchar(max)
	,[LastName]			varchar(max)
);

declare @Operations table (
	[KEY]								int
	,[OperationsName]		varchar(max)
);

declare @Result table (
	[KEY]						int
	,[User]					int
	,[Branch1]			int
	,[Branch2]			int
	,[DateFrom]			datetime
	,[DateTo]				datetime
	,[Zayavka]			varchar(max)
	,[Date]					datetime
	,[Operation]		int
);

insert into @Branch1 ([BKEY1], [Description])
values
	(1, 'отделение1_1'),
	(2, 'отделение1_2'),
	(3, 'отделение1_3')
	;

insert into @Branch2 ([BKEY2], [Description])
values
	(1, 'отделение2_1'),
	(2, 'отделение2_2'),
	(3, 'отделение2_3');	

insert into @Users ([KEY], [FirstName], [MiddleName], [LastName])
values
	(1, 'Иван', 'Иванович', 'Иванов'),
	(2, 'Пётр', 'Петрович', 'Петров');

insert into @Operations ([KEY], [OperationsName])
values
	(1, 'операция1'),
	(2, 'операция2');
	
insert into @Result ([KEY], [User], [Branch1], [Branch2], [DateFrom], [DateTo], [Zayavka], [Date], [Operation])
values
 (1, 1, 1, 1, '2012-09-12', '2012-09-15', 'zayavka1', '2012-09-12', 2),
 (2, 1, 2, 2, '2012-09-07', '2012-10-20', 'zayavka2', '2012-09-07', 2);
 
select
	r.[KEY],
	r.[Date],
	u.[FirstName],
	u.[MiddleName],
	u.[LastName],
	b1.[Description],
	b2.[Description]
from @Result as r
left join @Users as u
	on u.[KEY] = r.[User]
left join @Branch1 as b1
	on b1.[BKEY1] = r.[Branch1]
left join @Branch2 as b2
	on b2.[BKEY2] = r.[Branch2]
where r.[Operation] = 2
order by r.[Date] desc;
12 сен 12, 17:58    [13153633]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
OperationsName забыл. В целом мысль понятна?
12 сен 12, 17:59    [13153643]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
Dandy777,
На будущее: тщательно и обдуманно выбирай имена таблиц и полей.
12 сен 12, 18:04    [13153670]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
thrashead
OperationsName забыл. В целом мысль понятна?


К сожалению не так близко знаком с T-SQL, но попробую разобраться.
12 сен 12, 18:06    [13153678]     Ответить | Цитировать Сообщить модератору
 Re: SELECT связь таблиц  [new]
Dandy777
Member

Откуда:
Сообщений: 127
thrashead
Dandy777,
На будущее: тщательно и обдуманно выбирай имена таблиц и полей.


Это я уже понял, почти сразу. Спасибо за совет.
12 сен 12, 18:12    [13153709]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить