На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Pr0[)!9Y, Akina, JoeUser
Страницы: (13) « Первая ... 11 12 [13]  все  ( Перейти к последнему сообщению )  
> Помогите с запросом
    Цитата ^D^ima @
    как-то можно это выполнить в отладочном режиме без записи самих данных в таблицу?

    Конечно... комментируешь первую строку - остаётся нормальный SELECT.

    Вернее, не очень нормальный. У тебя:
    ExpandedWrap disabled
      from Project
      left JOIN Company ON Company.ID = Project.CustomerCompanyID
      where (что-то) and Company.FileAs is not null

    что вырождается в
    ExpandedWrap disabled
      from Project
      inner JOIN Company ON Company.ID = Project.CustomerCompanyID
      where (что-то)

    Зачем заставлять сервер делать ненужную работу?

    Цитата ^D^ima @
    Получается как-то так тогда?

    Нет. У тебя отсутствует:
    - класс совмещения данных ON <merge_search_condition> - т.е. собственно то условие, по которому будет определяться, MATCHED текущая запись или NOT MATCHED.
    - описание источника AS table_alias ( column_alias [ ,...n ] ), соответственно неверна ссылка на вставляемые значения.
    Т.е. должно быть что-то типа

    ExpandedWrap disabled
      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, и действуйте соответственно.
    Есть претензии ко мне как к участнику? да ради бога.
    Не нравятся мои ответы? не читайте их.
    В общем, берегите себя. Нервные клетки не восстанавливаются.
      Цитата Akina @
      ON (target.DocumentID = source.DocumentID) /* Слияние по условию */

      А остальные условия не должны там быть?
      ExpandedWrap disabled
        ON (target.DocumentClass=24, target.DocumentID = source.DocumentID, target.CategoryID=12)
      "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
        Цитата ^D^ima @
        А остальные условия не должны там быть?

        Там должно быть выражение, по которому выявляется дубликат. У тебя дубликат - по одному полю.
        Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
        Есть претензии ко мне как к участнику? да ради бога.
        Не нравятся мои ответы? не читайте их.
        В общем, берегите себя. Нервные клетки не восстанавливаются.
          Цитата Akina @
          У тебя дубликат - по одному полю.

          По 3 получается.

          Т.е. если в таблице нет записи 24,1023,12 то она создается, если есть не создается. Но если смотреть просто по 2 полю, например есть ли такое число 1023, то это не верно, т.к. уже писал что поле не уникально
          "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
            ааа, вон оно как... тогда да, все три поля...

            ExpandedWrap disabled
              ON (targetDocumentClass = 24 AND target.DocumentID = source.DocumentID AND target.CategoryID = 12)
            Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
            Есть претензии ко мне как к участнику? да ради бога.
            Не нравятся мои ответы? не читайте их.
            В общем, берегите себя. Нервные клетки не восстанавливаются.
              На что ругается?
              ExpandedWrap disabled
                Сообщение 547, уровень 16, состояние 0, строка 5
                Конфликт инструкции MERGE с ограничением FOREIGN KEY "DocumentCategoriesFK". Конфликт произошел в базе данных "PJM10", таблица "dbo.Document".

              Прикреплённый файлПрикреплённый файлsql.png (53,79 Кбайт, скачиваний: 15)
              "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
                В этой базе есть хранимая процедура, которая как я понимаю и отвечает за добавление категории в документ, может быть эту процедуру использовать? В том плане что вызвать?
                ExpandedWrap disabled
                  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, так лучше?

                Добавлено
                Он вот с таким запускается параметрами:
                ExpandedWrap disabled
                  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?
                ExpandedWrap disabled
                  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
                "Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script Execution time: 0,1228 ]   [ 16 queries used ]   [ Generated: 18.02.19, 18:35 GMT ]