代码之家  ›  专栏  ›  技术社区  ›  DKCroat

比较两个表之间的数据,并在第一个表中用“y”填充标志列(如果存在),否则为“n”

  •  -1
  • DKCroat  · 技术社区  · 6 年前

    我有两个表,如果第一个表中存在数据,则用“y”填充标志列,如果不使用“n”填充,则只比较3列,一列是数字,第二列是名称,第三列是日期时间。然而,我的业务规则案例陈述始终返回“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')
    

    因此,如果数据是否在表1中,表2中的最后一列4应该基于Y/N填充。 我写的查询如下:

       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 回复  |  直到 6 年前
        1
  •  1
  •   GolezTrol    6 年前

    您正在检查另一个表中是否单独存在这三个值,这种情况几乎总是如此。看起来您需要检查组合值,这与下面的查询类似。

    我随意地把 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