#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 таблиц
-
Если вы хотите применить условие в предложении «where» для электронной почты (например, db1.user.email = db2.user.email), то вы можете написать db1.user.email или db2.user.email после «select», потому что оба значения одинаковы.
-
Если вы хотите применить условие >= или <=, вы должны применить «регистр» после «выбрать».Потому что вам нужно извлечь любое одно значение из 2 таблиц
Например, вы хотите получить данные lastlogin, для этого условия я применил регистр в столбце lastlogin. По этому условию вы получите значение столбца либо из db1.user, либо из db2.user.
- условия в предложении 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 . Итак, должен ли я проверять условие для каждого столбца или есть какой-либо способ, с помощью которого я могу проверять условие один раз для каждой записи и выбирать все столбцы за один раз, а не выбирать один за другим. Теперь понятно?