如何在同一查询中根据条件使用不同的表插入

时间:2016-10-07 05:33:50

标签: sql sql-server tsql

我正在合并一个表中的数据来自2个数据库的表。结构如下:

  

新数据库中的表格

     

用户表:{用户名,电子邮件}

     

Database1中的表格

     

用户表:{UserName,Email,LastLogin}

     

Database2中的表格

     

用户表:{UserName,Email,LastLogin}

现在我需要编写一个查询,如果数据库1和数据库2的2个表中的电子邮件地址相同,那么我们需要在LastLogin最新的位置插入记录。

有人可以建议吗。

4 个答案:

答案 0 :(得分:2)

我认为你需要这个......:)

尝试相应地修改它。

declare @Email_1 nvarchar(100),@Email_2 nvarchar(100),@UserName nvarchar(100),@Lastlogin_1 datetime,@Lastlogin_2 datetime,@loop int=0
use [Database1]
while @loop != (select count(Distinct Email) from [User Table])
BEGIN
use [Database1]
set @Email_1 = (select Distinct Email from [User Table] order by email asc offset @loop rows fetch next 1 rows only)
set @LastLogin_1 = (select top 1 max(LastLogin) from [User Table] where email=@Email_1)

use [Database2]
set @Email_2 = (select top 1 Email from [User Table]  where Email like '%@Email_1%')
set @LastLogin_2 = (select top 1 max(LastLogin) from [User Table] where email=@Email_2)

if @email_1=@email_2
BEGIN
if @LastLogin_1>@LastLogin_2
BEGIN
use [Database_1]
set @username = (select top 1 Username from [user table] where email=@email_1 and lastlogin=@Lastlogin_1)
use [New Database]
insert into [User Table]
select @username,@email_1
END
else if @LastLogin_1<@LastLogin_2
BEGIN
use [Database_2]
set @username = (select top 1 Username from [user table] where email=@email_2 and lastlogin=@Lastlogin_2)
use [New Database]
insert into [User Table]
select @username,@email_1
use [Database1]
END
END
set @loop=@loop+1
END

答案 1 :(得分:0)

我的以下代码假设所有表都在一个数据库中,这更多是为了便于演示。在现实世界中,当您在不同数据库中拥有表时,则需要使用3部分命名约定,即

[DB].[Schema].[Table]

我也在sql server环境中测试。

use tempdb 
drop table dbo.merge_tbl, dbo.t1, dbo.t2;
create table dbo.merge_tbl (username varchar(30), email varchar(30));

create table dbo.t1 (username varchar(30), email varchar(30), lastlogin datetime)
create table dbo.t2 (username varchar(30), email varchar(30), lastlogin datetime)
go
-- insert a few records to tables
insert into dbo.t1 (username, email, lastlogin)
values ('james1', 'j@a.com', '20161001'), ('jenny1', 'j2@b.com', '20161002'), ('jeffrey1', 'j3@c.com', '20150101')

insert into dbo.t2(username, email, lastlogin)
values ('james2', 'j@a.com', '20161006'), ('jenny2', 'j2@b.com', '20151002'), ('jeffrey2', 'j4@c.com', '20170101')
go

-- this is the insert statement
insert into dbo.merge_tbl (username, email)
select case when t1.lastlogin >= t2.lastlogin then t1.username else t2.username end
,   case when t1.lastlogin >= t2.lastlogin then t1.email else t2.email end 
from dbo.t1 
inner join dbo.t2
on t1.email = t2.email;
go

-- check result
select * from dbo.merge_tbl

结果如下

enter image description here

答案 2 :(得分:0)

在访问不同数据库中的表时遵循3部分命名约定([Database Name].[Schema].[Table name])。同样,表[User Table]中的单个用户可能有多个登录条目,因此在这种情况下使用分组功能。

如果您使用的是SQL Server,请使用以下脚本来获得结果。

INSERT INTO [New Database].dbo.[User Table] (UserName,Email)
SELECT CASE WHEN MAX(a.LastLogin)>=MAX(b.LastLogin) THEN a.[UserName] ELSE b.[UserName] END [UserName],a.Email
FROM Database1.dbo.[User Table] a
 JOIN  Database2.dbo.[User Table] b
   ON a.Email=b.Email
GROUP BY a.[UserName],b.[UserName],a.Email

答案 3 :(得分:0)

假设三个数据库是db0,db1和db2。要合并数据库db0中的数据,请运行以下查询:

insert into db0.user('name','email')
select name, email from (
select db1.name,db1.email,
case 
  when db1.user.lastlogin >= db2.user.lastlogin 
  then db1.user.lastlogin
  else db2.user.lastlogin
end as lastlogin
from db1.user,db2.user
where db1.user.email = db2.user.email ) as a 

<强>更新

insert into db0.user(all columns)
select * from (
    select "apply case for some columns" from db1.user,db2.user
    where "apply your condition" ) as a

考虑以下事实: 1.在上面的查询中,我们在db1.user和db2.user之间进行交叉乘法,通过它我们从这两个表中获取所有可能的值

  1. 如果要在电子邮件的“where”子句中应用条件(例如db1.user.email = db2.user.email),则可以在之后编写db1.user.email或db2.user.email。 “选择”,因为两个值都相同。

  2. 如果您要应用&gt; =或&lt; = condition,则必须在“select”之后应用“case”。因为您必须从2个表中获取任何一个值

  3. 例如,您想要获取lastlogin数据,对于这种情况,我在lastlogin列中应用了case。在这种情况下,您将从db1.user或db2.user获取列值。

    1. where子句中的条件也可以在“select”之后以case格式写出。
    2. 请查看更新部分。 我去祈祷,这就是为什么这个迟到的回复。

      如果它有助于标记为正确的答案。 谢谢