我有两张这样的表
Tableyesterday :
Column1 Column2 Column3 Column4
------------------------------------------------------
John 5584 samsung 2017-08-31 23:43:06.867
Bob 4512 apple 2017-08-31 23:43:06.867
Hana 1881 nokia 2017-08-31 23:43:06.867
Hanz 4866 alcatel 2017-08-31 23:43:06.867
Nicol 48633 android 2017-08-31 23:43:06.867 ---gone
Tabletoday
Column1 Column2 Column3 Column4
------------------------------------------------------
John 5584 samsung 2017-09-01 23:43:06.867 ---same entry
Bob 4542446 apple 2017-09-01 23:43:06.867 ---change in column2
Hana 1881 halophone 2017-09-01 23:43:06.867 ---change in column3
Hanz 4866 alcatel 2017-09-01 23:43:06.867 ---same entry
Mark 486654 alcatel 2017-09-01 23:43:06.867 ---new entry
我需要选择今天的更改并插入tableofchanges。只需要选择这两行:
Tableofchanges
Bob 4542446 apple 2017-09-01 23:43:06.867
Hana 1881 halophone 2017-09-01 23:43:06.867
我创建了这个查询,但是我不能在最终选择中包含Column4。但是,如果我选择/插入没有Column4,我不会在结果中看到Column4:
insert into Tableofchanges
select
Column1, Column2, Column3
from
[dbo].[tabletoday]
except
select
Column1, Column2, Column3
from
[dbo].[Tableyesterday]
where
tabletoday.Column4 = Tableyesterday.Column4
OR
INSERT INTO [dbo].[Tableofchanges] (Column1, Column2, Column3, Column4)
SELECT
Column1, Column2, Column3, Column4
FROM
[dbo].[Tableyesterday]
WHERE
(NOT EXISTS (SELECT Column1, Column2, Column3, Column4
FROM [dbo].[Tabletoday]
WHERE ([dbo].[Tableyesterday].Column1 = Column1)
AND ([dbo].[Tabletoday].Column1 = Column1)
AND ([dbo].[Tableyesterday].Column2 = Column2)
AND ([dbo].[Tabletoday].Column2 = Column2)
AND ([dbo].[Tableyesterday].Column3 = Column3)
AND ([dbo].[Tabletoday].Column3 = Column3)))
非常感谢您修复我的查询
答案 0 :(得分:0)
您想要今天的记录,其中昨天的数据中存在具有相同键但具有不同属性的记录。假设您的密钥是Column1
,插入语句将是:
insert into tableofchanges
select column1, column2,column3
from dbo.tabletoday t
where exists
(
select *
from Tableyesterday y
where y.Column1 = t.Column1
and (y.Column2 <> t.Column2 or y.Column3 <> t.Column3
);
如果Column2
或Column3
可以为null,则必须为此调整WHERE
子句,因为<>
未检测到null的更改
答案 1 :(得分:0)
在此查询中,记录昨天在表格中更改日期的记录,以获取昨天表格中的类似记录。考虑Column1是主键。您无法比较日期,因为您的第4列中的日期在今天和昨天之间发生了变化。所以,拔出
有变化的记录 联盟 今天新插入的记录,昨天不在那里
SELECT a.Column1, a.Column2, a.Column3, a.Column4 FROM Tabletoday a INNER JOIN Tableyesterday b ON a.Column1 = b.Column1
AND (ISNULL(a.Column2,'') <> ISNULL(b.Column2,'')
OR ISNULL(a.Column3,'') <> ISNULL(b.Column3,''))
UNION
SELECT a.Column1, a.Column2, a.Column3, a.Column4 FROM @Tabletoday a
WHERE NOT EXISTS(SELECT 1 FROM Tableyesterday b WHERE a.Column1 = b.Column1)