Sql 将记录从一个表复制到另一个表而不重复

Sql 将记录从一个表复制到另一个表而不重复,sql,sql-server-2008,Sql,Sql Server 2008,这两个示例都将所有5条记录复制到新表中 我只想看到一个独特的名字,所以只有一个凯文应该出现 为什么这些不起作用,或者有更好的方法吗 这似乎是一件很简单的事情。根据评论,如果W在X之前,那么你应该能够做到 IF object_id('tempdb..#A') IS NOT NULL DROP TABLE #A IF object_id('tempdb..#B') IS NOT NULL DROP TABLE #B CREATE TABLE #A (fname varchar(20), lnam

这两个示例都将所有5条记录复制到新表中

我只想看到一个独特的名字,所以只有一个凯文应该出现

为什么这些不起作用,或者有更好的方法吗


这似乎是一件很简单的事情。

根据评论,如果W在X之前,那么你应该能够做到

IF object_id('tempdb..#A')  IS NOT NULL DROP TABLE #A
IF object_id('tempdb..#B')  IS NOT NULL DROP TABLE #B
CREATE TABLE #A (fname varchar(20), lname varchar(20))
CREATE TABLE #B (fname varchar(20), lname varchar(20))

INSERT INTO #A
SELECT 'Kevin', 'XP'
UNION ALL
SELECT 'Tammy', 'Win7'
UNION ALL
SELECT 'Wes', 'XP'
UNION ALL 
SELECT 'Susan', 'Win7'
UNION ALL
SELECT 'Kevin', 'Win7'


SELECT * FROM #A

INSERT INTO #B
SELECT a.fname, a.lname FROM #A a
WHERE a.fname NOT IN (SELECT fname from #B)

SELECT * FROM #B

DELETE FROM #B
INSERT INTO #B
SELECT a.fname, a.lname FROM #A a
LEFT OUTER JOIN #B b ON a.fname = b.fname
WHERE a.fname NOT IN (SELECT fname from #B)

SELECT * FROM #B

根据评论,如果W在X之前,那么你应该可以这样做

IF object_id('tempdb..#A')  IS NOT NULL DROP TABLE #A
IF object_id('tempdb..#B')  IS NOT NULL DROP TABLE #B
CREATE TABLE #A (fname varchar(20), lname varchar(20))
CREATE TABLE #B (fname varchar(20), lname varchar(20))

INSERT INTO #A
SELECT 'Kevin', 'XP'
UNION ALL
SELECT 'Tammy', 'Win7'
UNION ALL
SELECT 'Wes', 'XP'
UNION ALL 
SELECT 'Susan', 'Win7'
UNION ALL
SELECT 'Kevin', 'Win7'


SELECT * FROM #A

INSERT INTO #B
SELECT a.fname, a.lname FROM #A a
WHERE a.fname NOT IN (SELECT fname from #B)

SELECT * FROM #B

DELETE FROM #B
INSERT INTO #B
SELECT a.fname, a.lname FROM #A a
LEFT OUTER JOIN #B b ON a.fname = b.fname
WHERE a.fname NOT IN (SELECT fname from #B)

SELECT * FROM #B

回答你的问题,为什么你的问题不起作用

INSERT INTO #B
SELECT fname, lname
FROM (
    SELECT fname, lname,
           ROW_NUMBER() OVER(PARTITION BY fname ORDER BY lname) r
    FROM #A
) t
WHERE r=1
此操作在两个不同的操作中进行评估。首先,执行查询的SELECT部分。它返回一个表。在这种情况下,B是空的,因此,A中的每个元组都将是该结果的一部分。然后,一旦计算出这个结果,这个结果就被插入到B中。B将作为a的副本结束

DBMS不会像您的问题所暗示的那样,先插入一个元组,然后再重新计算查询中的下一个元组。插入总是在查询完成计算后完成

如果您的目标是在B中插入A中的元组而不重复,那么有很多方法可以做到这一点。其中之一是:

INSERT INTO #B
SELECT a.fname, a.lname FROM #A a
WHERE a.fname NOT IN (SELECT fname from #B)

-dmg

回答您的问题,为什么您的查询不起作用

INSERT INTO #B
SELECT fname, lname
FROM (
    SELECT fname, lname,
           ROW_NUMBER() OVER(PARTITION BY fname ORDER BY lname) r
    FROM #A
) t
WHERE r=1
此操作在两个不同的操作中进行评估。首先,执行查询的SELECT部分。它返回一个表。在这种情况下,B是空的,因此,A中的每个元组都将是该结果的一部分。然后,一旦计算出这个结果,这个结果就被插入到B中。B将作为a的副本结束

DBMS不会像您的问题所暗示的那样,先插入一个元组,然后再重新计算查询中的下一个元组。插入总是在查询完成计算后完成

如果您的目标是在B中插入A中的元组而不重复,那么有很多方法可以做到这一点。其中之一是:

INSERT INTO #B
SELECT a.fname, a.lname FROM #A a
WHERE a.fname NOT IN (SELECT fname from #B)

-dmg只需在select查询上使用DISTINCT:

INSERT INTO #B SELECT distinct * from #A;

只需在select查询上使用DISTINCT:

INSERT INTO #B SELECT distinct * from #A;

这将创建具有唯一fname的行,如果Win7和XP都存在,则采用Win7

INSERT INTO TARGET_TABLE
SELECT DISTINCT * FROM
(
     -- some big query
) x

这将创建具有唯一fname的行,如果Win7和XP都存在,则采用Win7

INSERT INTO TARGET_TABLE
SELECT DISTINCT * FROM
(
     -- some big query
) x

但是哪个Kevin应该进入新表?Windows7如果两者都存在为什么Windows7?也许你可以发布这个表应该是什么样子,以及“Win7”是什么意思。与其叫lname,不如叫它OS。该查询从Altiris获取计算机名及其操作系统的列表,但是如果旧计算机没有从列表中删除,XP和Win7都会显示出来。我想显示唯一的计算机名和最近安装的操作系统。例如,我们可以继续称之为lname。;当列表为Select distinct fname、maxcase lname(当“XP”时)、maxcase lname(当“Win7”时)、2 else 0(当列表为lname时)、case lname(当列表为lname时)、case lname(当列表为lname>0时)、case lname(当列表为lname时)、case lname(当列表为lname时)、case lname(当列表为lname时)、case lname(当列表为lname为“XP”时、当列表为“Win7”?也许你可以发布这个表应该是什么样子,以及“Win7”是什么意思。与其叫lname,不如叫它OS。该查询从Altiris获取计算机名及其操作系统的列表,但是如果旧计算机没有从列表中删除,XP和Win7都会显示出来。我想显示唯一的计算机名和最近安装的操作系统。例如,我们可以继续称之为lname。;当列表为Select distinct fname、MAXSCAE lname(当“XP”时)、MAXSCAE lname(当“Win7”时)、2 else 0(当列表为lname时)、case lname(当列表为lname时)、case lname(当列表为“XP”时)、case lname(当列表为“XP”时)、MAXSCAE lname(当列表为“XP”时)、MAXSCASE lname(当列表为“XP”时)、MAXSCASE lname(当列表为,我误解了你的问题。我认为您需要不同的元组,而不仅仅是一个属性。我同意与GROUP by一起插入是最好的解决方案。插入到B SELECT DISTINCT中仍然复制了5条记录。对不起,我误解了你的问题。我认为您需要不同的元组,而不仅仅是一个属性。我同意使用groupby插入是最好的解决方案。我喜欢这个,但是MINlname更简单。ThxI喜欢这个,但MINlname更简单。ThxThanks。我不知道MIN也在弦上工作。在我上面的评论中,我使用CASE语句将其转换为数字,然后选择所需的数字。这容易多了,谢谢。我不知道MIN也在弦上工作。在我上面的评论中,我使用CASE语句将其转换为数字,然后选择所需的数字。这要容易得多。