我有一组包含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中有一种直接的方法吗?
答案 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)