簡體   English   中英

如何在同一查詢中根據條件使用不同的表進行插入

[英]How to insert using different table based on condition in same query

我正在將數據從2個數據庫的表合並到一個表中。 結構如下:

新數據庫中的表

用戶表:{UserName,Email}

數據庫1中的表

用戶表:{UserName,Email,LastLogin}

數據庫2中的表

用戶表:{UserName,Email,LastLogin}

現在,我需要編寫查詢,如果數據庫1和數據庫2的2個表中的電子郵件地址相同,那么我們需要在LastLogin最新的地方插入記錄。

有人可以建議這個。

我認為您需要此.. :)

嘗試相應地對其進行修改。

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

我的以下代碼假定所有表都在一個數據庫中,這更多是出於演示方便的目的。 在現實世界中,當表位於不同的數據庫中時,則需要使用三部分命名約定,即

[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

這是結果

在此處輸入圖片說明

在不同數據庫中訪問表時,請遵循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

假設三個數據庫分別為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之間進行交叉乘法,由此我們從這2個表中獲得所有可能的值

  1. 如果要在電子郵件的“ where”子句中應用條件(例如db1.user.email = db2.user.email),則可以在“ select”之后寫db1.user.email或db2.user.email,因為兩者值是相同的。

  2. 如果要應用> =或<=條件,則必須在“ select”之后應用“ case”。因為您必須從2個表中獲取任何一個值

例如,您要獲取lastlogin數據,對於這種情況,我在lastlogin列中應用了大小寫。 在這種情況下,您將從db1.user或db2.user中獲得列值。

  1. where子句中的條件也可以在“ select”之后以大小寫形式編寫。

請看一下UPDATE部分。 我去祈禱,這就是為什么這個遲來的答復。

如果它有助於標記為正確答案。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM