Как вставить, используя другую таблицу на основе условия в том же запросе

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я объединяю данные в одну таблицу из таблиц базы данных 2. Структура приведена ниже:

Таблица в новой базе данных :

Таблица пользователя: {Имя пользователя, адрес электронной почты}

Таблица в базе данных 1 :

Таблица пользователя: {Имя пользователя, адрес электронной почты, LastLogin}

Таблица в Database2 :

Таблица пользователя: {Имя пользователя, адрес электронной почты, LastLogin}

Теперь мне нужно написать запрос, что если адрес электронной почты совпадает в 2 таблицах из базы данных 1 и базы данных 2, то нам нужно вставить запись, где LastLogin является последним.

Может кто-нибудь предложить по этому поводу.

Комментарии:

1. Добавьте пример табличных данных и ожидаемый результат (все в том числе форматированный текст). Также покажите нам вашу текущую попытку запроса!

2. Помечен на sql-server основе комментария к первому ответу

Ответ №1:

Я думаю, вам это нужно .. 🙂

Попробуйте изменить его соответствующим образом..

 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
  

Ответ №2:

В моем следующем коде предполагается, что все таблицы находятся в одной базе данных, это больше для удобства демонстрации. В реальном мире, когда у вас есть таблицы в разных базах данных, вам необходимо использовать соглашение об именовании из 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
  

Вот результат

введите описание изображения здесь

Комментарии:

1. Я использовал ту же логику, но в моей таблице более 15 столбцов, поэтому я должен проверять каждое поле на всякий случай или у нас есть какой-либо способ, с помощью которого мы можем проверить условие один раз, а затем получить полную запись

2. У меня есть существующие 2 базы данных, которые находятся на sql server. в пользовательской таблице есть почти 15 столбцов, так что у нас есть какой-либо способ, который мы можем проверить один раз, а затем вставить весь столбец.

Ответ №3:

следуйте соглашению об именовании из 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
  

Ответ №4:

Предполагая, что три базы данных 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), то вы можете написать db1.user.email или db2.user.email после «select», потому что оба значения одинаковы.

  2. Если вы хотите применить условие >= или <=, вы должны применить «регистр» после «выбрать».Потому что вам нужно извлечь любое одно значение из 2 таблиц

Например, вы хотите получить данные lastlogin, для этого условия я применил регистр в столбце lastlogin. По этому условию вы получите значение столбца либо из db1.user, либо из db2.user.

  1. условия в предложении where также могут быть записаны в регистрационной форме после «выбрать».

Пожалуйста, ознакомьтесь с обновленной частью. И я пошел на молитву, вот почему этот поздний ответ.

Если это поможет отметить как правильный ответ. Спасибо

Комментарии:

1. Спасибо за предложение, но моя проблема в том, что мне нужно извлечь все столбцы на основе условия db1.user.lastlogin> = db2.user.lastlogin. Итак, один из вариантов заключается в том, что я проверяю это условие для каждого столбца, но поскольку у меня длинный список столбцов, есть ли какой-нибудь способ пропустить дополнительную проверку. Если условие истинно, извлеките весь столбец из db1, остальное выберите из db2

2. сколько столбцов вы хотите сравнить? состоит ли ваша таблица db0.user из 2 столбцов? Если да, то хотите ли вы вставить все столбцы из db1.user или db2.user в этот db0.user? пожалуйста, уточните это

3. пожалуйста, уточните строку: «Итак, один из вариантов заключается в том, что я проверяю это условие для каждого столбца, но поскольку у меня длинный список столбцов, есть ли какой-либо способ пропустить дополнительную проверку»

4. Означает, что я упомянул только 2 столбца Имя пользователя, адрес электронной почты только для удобства обработки данных, но на самом деле у меня всего 15 столбцов, которые мне нужно вставить на основе условия LastLogin . Итак, должен ли я проверять условие для каждого столбца или есть какой-либо способ, с помощью которого я могу проверять условие один раз для каждой записи и выбирать все столбцы за один раз, а не выбирать один за другим. Теперь понятно?