【问题标题】:SQL adding a new column to check whether ID appears in another tableSQL添加新列以检查ID是否出现在另一个表中
【发布时间】:2017-09-25 20:25:28
【问题描述】:

我处理学生数据,有两个结构相同但数据集不同的表。我想添加一个记录为“0”或“1”的新列,以确定学生是否出现在另一个表中。示例:

Table 1:
s_id    s_year  s_term  s_crs       NewColumn(was student enrolled in 2016?)
123456  2017    Fall    Math 1010   1
654321  2017    Fall    Eng 1010    0

Table 2:
s_id    s_year  s_term  s_crs 
123456  2016    Fall    Math 2010
432516  2016    Fall    Eng 2010

你会怎么做呢?

SELECT s_id, s_year, s_term, s_crs 
(CASE 
    WHEN S_ID IN (select s_id from table2)
        THEN '1'

或类似的东西?我不确定如何用 join 写这个

【问题讨论】:

    标签: sql sql-server select case ssms


    【解决方案1】:

    您可以 left join 使用第二个表,看看结果列是否不为空:

    SELECT    t1.s_id, t1.s_year, t1.s_term, t1.s_crs, 
              CASE WHEN t2.s_id IS NOT NULL THEN 1 ELSE 0 END AS newcolum
    FROM      table1 t1
    LEFT JOIN table2 t2 ON t1.s_id = t2.s_id
    

    【讨论】:

      【解决方案2】:

      假设表 1 是结果...仅使用基于 s_id 和 s_year 的子查询...如果有其他要求,请更新 OP。

      SELECT
        s_id,
        s_year,
        s_term,
        s_crs,
        ISNULL((SELECT
          1
        FROM table2 t2
        WHERE t2.s_id = t1.s_id
        AND t2.s_year = 2016), 0) [NewCol 2016]
      FROM table1 t1
      

      【讨论】:

        【解决方案3】:

        假设s_id 是一个通用标识符

        SELECT t1.s_id, t1.s_year, t1.s_term, t1.s_crs, 1 as NewColumn
        FROM table1 t1
        WHERE EXISTS (SELECT 1 FROM Table2 t2 WHERE t1.s_id = t2.s_id)
        UNION 
        SELECT t1.s_id, t1.s_year, t1.s_term, t1.s_crs, 0 as NewColumn
        FROM table1 t1
        WHERE NOT EXISTS (SELECT 1 FROM Table2 t2 WHERE t1.s_id = t2.s_id)
        

        【讨论】:

          【解决方案4】:

          你可以这样做

          ALTER TABLE Table1 ADD NewColumn BIT NOT NULL DEFAULT (0)
          

          此时 Table1 中的所有项目都将为 0,现在您只需将所需项目更新为 1

          UPDATE Table1
          SET NewColumn = 1
          WHERE ID IN (SELECT ID FROM Table2)
          

          【讨论】:

            【解决方案5】:

            你可以使用左连接

            SELECT    t1.s_id, t1.s_year, t1.s_term, t1.s_crs, 
                      CASE WHEN t2.s_Year = '2016' THEN 1 ELSE 0 END AS [NewColumn(was student enrolled in 2016?)]
            FROM      table1 t1
            LEFT JOIN table2 t2 ON t1.s_id = t2.s_id
            

            【讨论】:

              【解决方案6】:
                create table #tbl1
                (
                  s_id int,
                  s_year varchar(4),
                  s_term varchar(4),
                  s_crs varchar (10)
                )
              
                insert into #tbl1 values(123456,'2017','Fall','Math 1010')
                insert into #tbl1 values(654321,'2017','Fall','Eng 1010')
              
                create table #tbl2
                (
                  s_id int,
                  s_year varchar(4),
                  s_term varchar(4),
                  s_crs varchar (10)
                )
              
                insert into #tbl2 values(123456,'2016','Fall','Math 2010');
                insert into #tbl2 values(432516,'2016','Fall','Eng 2010')
              
              
                select a.s_id,a.s_year,a.s_term,a.s_crs,case when b.s_id is null then '0' else '1' end as NewColumn
                from #tbl1 a left outer join #tbl2 b on a.s_id = b.s_id
              
              
              
                drop table #tbl1
                drop table #tbl2
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-02-16
                • 1970-01-01
                • 2018-10-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多