Вставка уникального значения из другой таблицы - PullRequest
0 голосов
/ 23 сентября 2019

Таблицы: у меня есть 3 таблицы. Это cust, new_cust, old_cust, все они имеют 3 столбца, это id, имя пользователя, имя, каждая из которых имеет возможность иметь те же данные, что и другие.Я хотел бы сделать «целую» таблицу, которая будет состоять из всех, но только из уникальных.

Я пытался

Создание фиктивной таблицы

Я пыталсясоздайте фиктивную таблицу с именем "Temp" с помощью

select * 
into Temp 
from cust

вставьте все таблицы в фиктивные

Затем я вставлю их все в их таблицу Temp

insert into temp
select * from new_cust

insert into temp
select * from old_cust

уникальные, использующие различные

После того, как они все слились, я использую различные, чтобы получить только уникальное значение идентификатора

select distinct(id), username, fullname
into Whole
from temp

это уменьшило некоторые строки

Результат

Но после того, как я переместил его во всю таблицу, я хотел бы поставить первичный ключ на id, но я получил сообщение, что есть некоторые повторяющиеся значения.Есть ли другой способ?

Ответы [ 5 ]

0 голосов
/ 23 сентября 2019

Что значение Unique означает для вашей строки?

Если это только имя пользователя и вам не нужно сохранять старые значения идентификатора, это предпочтет данные new_cust над данными old_cust.

SELECT  
    ID = ROW_NUMBER() OVER (ORDER BY all_temp.username) 
,   all_temp.* 
INTO dbo.Temp
FROM 
(
        SELECT nc.username, nc.[name] FROM new_cust AS nc   
    UNION
        SELECT oc.username, oc.[name]
        FROM old_cust AS oc
        WHERE oc.username NOT IN (SELECT nc1.username FROM new_cust AS nc1) --remove the where part if needed
) AS all_temp

ALTER TABLE dbo.Temp ALTER COLUMN ID INTEGER NOT NULL
ALTER TABLE dbo.Temp ADD PRIMARY KEY (ID)

Если под уникальным вы подразумеваете как имя пользователя, так и имя, просто удалите часть where в объединении

0 голосов
/ 23 сентября 2019

Я предполагаю, что вам нужны уникальные id s.И вы хотите, чтобы эти таблицы были расположены по приоритетам в некотором порядке.Если это так, вы можете сделать это с union all и row_number():

select id, username, name
from (select c.*,
             row_number() over (partition by id order by priority) as seqnum
      from ((select id, username, name, 1 as priority
             from new_cust
            ) union all
            (select id, username, name, 2 as priority
             from cust
            ) union all
            (select id, username, name, 3 as priority
             from old_cust
            )
           ) c
     ) c
where seqnum = 1;
0 голосов
/ 23 сентября 2019

Попробуйте выполнить следующий запрос ...

WITH cte as (
      SELECT id, username, NAME, 
      ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t1.username, t1.name ) AS rn   
      FROM cust t1
      LEFT JOIN new_cust t2 ON t1.Id = t2.Id
      LEFT JOIN old_cust t3 ON t2.Id = t3.Id
    )
    SELECT id, username, NAME
    FROM cte
    WHERE rn = 1

Примечание: - Поместите весь запрос в CTE ( Общее табличное выражение ) с новым столбцом (rn), который вы будете использовать для фильтрации результатов.

Этот новый столбец будет производить ROW_NUMBER () .... PARTITION BY имя пользователя, имя .....

0 голосов
/ 23 сентября 2019

Но после того, как я переместил его во всю таблицу, я хотел бы поставить первичный ключ для идентификатора, но я получил сообщение, что есть некоторые повторяющиеся значения .?

Это потому, что вы пытаетесьвставить значение идентификатора из каждой таблицы во всю таблицу.Просто введите имя пользователя и имя и пропустите идентификатор.Идентификатор - IDENTITY, и он ДОЛЖЕН быть уникальным.

Запустите это на своей текущей таблице, чтобы увидеть, если у вас есть дублированные идентификаторы:

select COUNT(ID), username
from whole
GROUP BY  username
HAVING COUNT(ID) > 1

Чтобы уникальные клиенты воссоздалиТаблица Whole и сделать ID col IDENTITY:

IF OBJECT_ID ('dbo.Whole') IS NOT NULL DROP TABLE dbo.Whole;
CREATE TABLE Whole (ID INT NOT NULL IDENTITY(1,1), Name varchar(max), Username varchar(max))

Вставить значения во всю таблицу:

INSERT INTO Whole
SELECT Name, Username FROM cust
UNION 
SELECT Name, Username FROM new_cust
UNION
SELECT Name, Username FROM old_cust

Сделать ID col PK.

0 голосов
/ 23 сентября 2019

Попробуйте:

insert into temp
select * from new_cust

UNION

select * from old_cust

Объединение позволит избежать повторяющихся записей, а затем вы можете создать первичный ключ для столбца идентификатора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...