Цикл запроса SQL с другим значением, установленным для переменной в запросе? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть запрос, который сравнивает старую базу данных с новой базой данных в таблице «Клиенты», которая принадлежит определенному отделу, и получает разницу между этими таблицами базы данных.У меня есть запрос, как показано ниже

DECLARE @departmentid int = 2001

SELECT Distinct DB.[CUSTOMER_ID],DB.[CUSTOMER_AGE]
FROM [PROD\SQL01].[PRD_Live].[dbo].[Customers] DB 
WHERE DB.[DEPARTMENT_ID]= @departmentid and 
      DB.[CUSTOMER_ID] NOT IN (SELECT Distinct [CUSTOMER_ID] 
                               FROM [NEWPRD_Live].[dbo].[Customers] 
                               WHERE [DEPARTMENT_ID]=@departmentid)

Есть 40 значений идентификаторов отделов (например, 2001,2002, ..., 2040), которые должны быть установлены в переменной @departmentid, и в настоящее время я выполняю вышезапрос, изменяя идентификатор отдела каждый раз вручную и выполняя запрос 40 раз для 40 отделов.Можно ли установить для всех отделов одну переменную и выполнить запрос, установив каждый идентификатор отдела за раз в цикле и получить все результаты за раз?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Поместите свои идентификаторы в строку, разделенную запятыми, чтобы вы могли использовать функцию Split String, чтобы получить все эти значения и использовать их при поиске CUSTOMER_ID:

declare @ids varchar(max) = '2001,2002,2003'

SELECT Distinct DB.[DEPARTMENT_ID], DB.[CUSTOMER_ID], DB.[CUSTOMER_AGE]
FROM [PROD\SQL01].[PRD_Live].[dbo].[Customers] DB 
WHERE DB.[DEPARTMENT_ID]= (select value from string_split(@ids, ',') and 
      DB.[CUSTOMER_ID] NOT IN (SELECT Distinct [CUSTOMER_ID] 
                               FROM [NEWPRD_Live].[dbo].[Customers] 
                               WHERE [DEPARTMENT_ID]=DB.[DEPARTMENT_ID])

Примечание: String_split требует как минимум SQLServer 2016, если вы используете предыдущую версию, вы должны определить свою собственную функцию Split String, например: T-SQL split string

0 голосов
/ 23 сентября 2019

Если я правильно понимаю ваше требование, вам нужен список CUSTOMER_ID для каждого из DEPARTMENT_ID.Добавьте DEPARTMENT_ID к части DISTINCT, и вы получите желаемый результат

SELECT Distinct 
       DB.[DEPARTMENT_ID], 
       DB.[CUSTOMER_ID], 
       DB.[CUSTOMER_AGE]
FROM  [PROD\SQL01].[PRD_Live].[dbo].[Customers] DB 
where DB.[DEPARTMENT_ID] IN (2001, 2002, 2040)
and   DB.[CUSTOMER_ID] NOT IN
      (
           SELECT Distinct [CUSTOMER_ID] 
           FROM  [NEWPRD_Live].[dbo].[Customers] n
           where n.[DEPARTMENT_ID] = DB.[DEPARTMENT_ID]
      )
ORDER BY DB.[DEPARTMENT_ID], DB.[CUSTOMER_ID]
0 голосов
/ 23 сентября 2019

Попробуйте вставить идентификатор отдела в таблицу #temp и используйте его в предложении where:

Where DEPARTMENT_ID In (Select ID From #tmpDepartment)

Редактировать:

Поскольку вы не можете использовать # таблицы, здесь есть цикл:

DECLARE @DEPARTMENT_ID int = 2001,
        @limit int = 2040

While @DEPARTMENT_ID <= @limit
Begin
    SELECT Distinct DB.[CUSTOMER_ID],DB.[CUSTOMER_AGE]
    FROM [PROD\SQL01].[PRD_Live].[dbo].[Customers] DB 
    WHERE DB.[DEPARTMENT_ID]= @departmentid and 
          DB.[CUSTOMER_ID] NOT IN (SELECT Distinct [CUSTOMER_ID] 
                           FROM [NEWPRD_Live].[dbo].[Customers] 
                           WHERE [DEPARTMENT_ID]=@departmentid)
   Set @DEPARTMENT_ID = @DEPARTMENT_ID + 1
End

Но это не очень хороший дизайн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...