
![]() |
||
Наши проекты: | Журнал · Discuz!ML · Алгоритмы · Естественные науки · Wiki · DRKB · Помощь проекту |
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | DigiMania | RSS |
[54.197.24.206] |
![]() |
![]() | Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (13) « Первая ... 11 12 [13] все ( Перейти к последнему сообщению ) |
![]() |
Сообщ. #181,
|
|
Конечно... комментируешь первую строку - остаётся нормальный SELECT. Вернее, не очень нормальный. У тебя: ![]() ![]() from Project left JOIN Company ON Company.ID = Project.CustomerCompanyID where (что-то) and Company.FileAs is not null что вырождается в ![]() ![]() from Project inner JOIN Company ON Company.ID = Project.CustomerCompanyID where (что-то) Зачем заставлять сервер делать ненужную работу? Нет. У тебя отсутствует: - класс совмещения данных ON <merge_search_condition> - т.е. собственно то условие, по которому будет определяться, MATCHED текущая запись или NOT MATCHED. - описание источника AS table_alias ( column_alias [ ,...n ] ), соответственно неверна ссылка на вставляемые значения. Т.е. должно быть что-то типа ![]() ![]() MERGE DocumentCategory AS target /* Слияние с чем */ USING ( select 24,Company.ID,12 from Project inner JOIN Company ON Company.ID = Project.CustomerCompanyID where ((Project. EndDate BETWEEN '01.01.2017' AND '01.01.2019')or (Project.ContractDate<'01.01.2017'and Project.State<>4)) group by Company.id) AS source (DocumentClass,DocumentID,CategoryID) /* Слияние откуда */ ON (target.DocumentID = source.DocumentID) /* Слияние по условию */ WHEN NOT MATCHED THEN /* действие при невыполнении условия */ INSERT (DocumentClass,DocumentID,CategoryID) /* в какие поля вставлять */ VALUES (source.DocumentClass,source.DocumentID,source.CategoryID) /* какие данные вставлять */ Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога. Не нравятся мои ответы? не читайте их. В общем, берегите себя. Нервные клетки не восстанавливаются. |
![]() |
Сообщ. #182,
|
|
Цитата Akina @ ON (target.DocumentID = source.DocumentID) /* Слияние по условию */ А остальные условия не должны там быть? ![]() ![]() ON (target.DocumentClass=24, target.DocumentID = source.DocumentID, target.CategoryID=12) "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
|
![]() |
Сообщ. #183,
|
|
Цитата ^D^ima @ А остальные условия не должны там быть? Там должно быть выражение, по которому выявляется дубликат. У тебя дубликат - по одному полю. Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога. Не нравятся мои ответы? не читайте их. В общем, берегите себя. Нервные клетки не восстанавливаются. |
![]() |
Сообщ. #184,
|
|
Цитата Akina @ У тебя дубликат - по одному полю. По 3 получается. Т.е. если в таблице нет записи 24,1023,12 то она создается, если есть не создается. Но если смотреть просто по 2 полю, например есть ли такое число 1023, то это не верно, т.к. уже писал что поле не уникально "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
|
![]() |
Сообщ. #185,
|
|
ааа, вон оно как... тогда да, все три поля...
![]() ![]() ON (targetDocumentClass = 24 AND target.DocumentID = source.DocumentID AND target.CategoryID = 12) Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога. Не нравятся мои ответы? не читайте их. В общем, берегите себя. Нервные клетки не восстанавливаются. |
![]() |
Сообщ. #186,
|
|
На что ругается?
![]() ![]() Сообщение 547, уровень 16, состояние 0, строка 5 Конфликт инструкции MERGE с ограничением FOREIGN KEY "DocumentCategoriesFK". Конфликт произошел в базе данных "PJM10", таблица "dbo.Document". Прикреплённый файл ![]() "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
|
![]() |
Сообщ. #187,
|
|
В этой базе есть хранимая процедура, которая как я понимаю и отвечает за добавление категории в документ, может быть эту процедуру использовать? В том плане что вызвать?
![]() ![]() USE [PJM10] GO /****** Object: StoredProcedure [dbo].[adfDocumentCategoryUpdate] Script Date: 23.01.2019 17:47:34 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /****************************************************************************** ** File: ** Name: adfDocumentCategoryUpdate ** Desc: ** ** This template can be customized: ** ** Return values: ** ** Called by: ** ** Parameters: ** Input Output ** ---------- ----------- ** ** Auth: ** Date: ******************************************************************************* ** Change History ******************************************************************************* ** Date: Author: Description: ** -------- -------- ------------------------------------------- ** 19.02.13 SAP Отказ от OPENXML *******************************************************************************/ ALTER Procedure [dbo].[adfDocumentCategoryUpdate] @DocumentID TIdentifier, @DocumentClass TClass, @Xml XML AS DECLARE @ID TIdentifier SET NOCOUNT ON DECLARE categories CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT tab.col.value('Name[1]','nvarchar(256)'), tab.col.value('State[1]','int') FROM @Xml.nodes('//Item') tab(col) OPEN categories DECLARE @name TName, @state INT FETCH NEXT FROM categories INTO @name, @state WHILE @@FETCH_STATUS = 0 BEGIN SET @ID = dbo.adfGetCategoryID(@name, @DocumentClass) PRINT @name PRINT @ID IF @state = 2 -- added BEGIN IF NOT EXISTS(SELECT * FROM [DocumentCategory] WHERE [DocumentID] = @DocumentID AND [DocumentClass] = @DocumentClass AND [CategoryID] = @ID) BEGIN INSERT [DocumentCategory] ([DocumentID], [DocumentClass], [CategoryID]) VALUES(@DocumentID, @DocumentClass, @ID) END END ELSE IF @state = 3 -- deleted BEGIN IF EXISTS(SELECT * FROM [DocumentCategory] WHERE [DocumentID] = @DocumentID AND [DocumentClass] = @DocumentClass AND [CategoryID] = @ID) BEGIN DELETE [DocumentCategory] WHERE [DocumentID] = @DocumentID AND [DocumentClass] = @DocumentClass AND [CategoryID] = @ID END END IF @@error != 0 GOTO ERROR_HANDLER FETCH NEXT FROM categories INTO @name, @state END CLOSE categories DEALLOCATE categories RETURN 0 ERROR_HANDLER: CLOSE categories DEALLOCATE categories RETURN 1 Кстати там не MARGE используется почему-то а INSERT при IF EXISTS, так лучше? Добавлено Он вот с таким запускается параметрами: ![]() ![]() declare @p3 xml set @p3=convert(xml,N'<List><Item><Name>Новый Клиент</Name><State>2</State></Item></List>') exec adfDocumentCategoryUpdate @DocumentID=1042,@DocumentClass=9,@Xml=@p3 Я правильно понимаю что можно тупо этот код напрямую вызывать, как-то обернув через select? Не подскажешь как? Я имею в виду что вызвать эту процедуру для каждой выборки select? ![]() ![]() select 24,Company.ID,12 from Project inner JOIN Company ON Company.ID = Project.CustomerCompanyID where ((Project. EndDate BETWEEN '01.01.2017' AND '01.01.2019')or (Project.ContractDate<'01.01.2017'and Project.State<>4)) group by Company.id "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
|