сравнить данные между двумя таблицами и заполнить столбец флага в 1-й таблице с помощью «Y», если существует еще «N» - PullRequest
0 голосов
/ 10 января 2019

У меня есть две таблицы, если данные существуют в 1-й таблице, то заполните столбец флага 'Y', если не заполнен 'N', я сравниваю только 3 столбца, один номер, 2-й имя и 3-й столбец datetime , Однако мой регистр правил дела всегда возвращает «Y»

Table 1 (staging table, type1)
column1: number, data (123, 456,756)
column2: name, date('Mike', 'Dray','John')
column3: datetime. data('2018-12-03 14:00:52.000','2018-12-03 14:00:52.000','2018-12-03 14:00:52.000')

Table2 (landing table, type2)
column1 number, data (123, 456,756, 890)
column2: name, date('Mike', 'Dray','John','Chris')
column3: datetime. data('2018-12-03 14:00:52.000','2018-12-03 14:00:52.000','2018-12-03 14:00:52.000','2018-09-20 10:31:39.000')
column4: flagcolumn, data('Y','Y','Y','N')

, поэтому последний столбец 4 в таблице 2 должен заполняться до y / n на основе данных в таблице 1 или нет. Я написал запрос как:

   WITH CDE AS (
   SELECT T1.number,T1.name,T1.Bdatetime,       
   FROM dbo.db.table T1)
   ,CDE1 AS (
   SELECT  CDE.*,BUS_RULE_valid = (
                            select case 
                                    when EXISTS  (
                                    SELECT number, name, datetime
                                    FROM dbo.db.table T1
                            WHERE number IN                                       
                                    (SELECT number
                                    FROM  dbo.db.table2)
                            AND name 
                                    (SELECT  name FROM  dbo.db.t2)
                            AND datetime IN
                                    (SELECT datetime FROM  dbo.db.t2))
                                                  THEN 'Y'
                                                  ELSE 'N'
                                   END)
   FROM CDE
   )
   SELECT * FROM CDE1

1 Ответ

0 голосов
/ 10 января 2019

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

Я взял на себя смелость удалить часть with, так как здесь это не казалось необходимым. Но вы также можете сохранить его, решения будут такими же (кроме используемого псевдонима таблицы).

SELECT 
  T1.number_col,
  T1.name_col,
  T1.datetime_col,
  CASE WHEN EXISTS (
    SELECT 'x' FROM dbo.db.table2 T2
    WHERE
      t2.number_col = T1.number_col AND
      t2.name_col = T1.name_col AND
      t2.datetime_col = T1.datetime_col)
  THEN 'Y' 
  ELSE 'N'
  END AS BUS_RULE_valid
FROM dbo.db.table1 T1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...