2017-09-01 28 views
0

我有一组数据,其中包含两组标识符:该记录的唯一编号,Widget_Number以及记录的原始唯一编号, Original_Widget_Number。通常这两个值是相同的,但是当记录被修改时,将创建一个新记录,新记录为Widget_Number,保留Original_Widget_Number中旧的Widget_Number值。 IE SELECT * FROM widgets WHERE Widget_Number != Original_Widget_Number返回所有已更改的记录。 (Widget_Number对于新小工具增加10,对于修订小工具增加1)根据同一表中其他行中的值拉取某些行的SQL查询

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

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

我想查询返回行1 & 2.我知道我可以在一个更高层次的语言环槽这但有一个简单的方法来做到这一点在MS SQL中?使用exists()

回答

1

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 
) 
+0

谢谢!这两种方法都有效,但都提供了一些未改变记录的重复,例如:https://pastebin.com/CmpsM4Hm。让我比较记录和原件是可行的。任何想法如何防止重复,但? – Michael

+0

@Michael它取决于你想返回哪些行。你可以用'group by'来聚合,就像'select rowid = min(rowid),widget_number,original_widget_number from .... group by widget_number,original_widget_number' – SqlZim

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 
      ); 
+0

谢谢!这可以起作用,但会对未改变的记录提供一些重复,例如:https://pastebin.com/CmpsM4Hm。让我比较记录和原件是可行的。任何想法如何防止重复,但? – Michael

1
select * from widget 
where original_widget_number in 
(select original_widget_number from widget 
where widget_number <> original_widget_number) 
相关问题