SQL查询根据同一个表中其他行的值拉取某些行

时间:2017-09-01 13:10:26

标签: sql sql-server select

我有一组包含2组标识符的数据:该记录的唯一编号Widget_Number以及记录的原始唯一编号Original_Widget_Number。通常这两个值是相同的,但是当修改记录时,会使用新的Widget_Number创建新记录,同时保留Widget_Number中的旧Original_Widget_Number值。 IE SELECT * FROM widgets WHERE Widget_Number != Original_Widget_Number返回已更改的所有记录。 (Widget_Number对于新窗口小部件增加10,对于修订的窗口小部件增加1。)

我想返回所有已更改的记录以及与这些记录相关的原始记录。例如,如果我有一个包含以下内容的表:

   Widget_Number    Original_Widget Number   More_Data
1:  10               10                       Stephen
2:  11               10                       Steven
3:  20               20                       Joe

我想查询返回第1行和第1行2.我知道我可以在更高级别的语言中循环使用它,但在MS SQL中有一种直接的方法吗?

3 个答案:

答案 0 :(得分:1)

使用exists()

select *
from widgets as t
where exists (
  select 1
  from widgets as i
  where i.original_widget_number = t.original_widget_number
    and i.widget_number != i.original_widget_number
  )

in()

select *
from widgets as t
where t.original_widget_number in (
  select i.original_widget_number
  from widgets as i
  where i.widget_number != i.original_widget_number
  )

答案 1 :(得分:1)

以下内容应该同时获取已更改的记录和原始记录:

select w.*
from widgets w
where w.widget_number <> w.original_widget_number or
      exists (select 1
              from widgets w2
              where w.widget_number = w2.original_widget_number and
                    w2.widget_number <> w2.original_widget_number
             );

答案 2 :(得分:1)

select * from widget
where original_widget_number in 
(select original_widget_number from widget 
 where widget_number <> original_widget_number)