从Table1中选择非重复数据并插入Table2

时间:2013-01-20 07:39:00

标签: sql

我有一个表,我们称之为Table1,其中包含一堆垃圾数据,没有唯一的标识符列。

我想从Table1中选择一些列并将数据传输到Table2。但是,我想防止插入3列的重复条目。

假设我有一行需要转移所需的列[FirstName][LastName][CompanyName][City][State]。我只希望将[FirstName][LastName][CompanyName]的唯一组合的行与其各自的[City][State]一起复制到Table2。

4 个答案:

答案 0 :(得分:2)

我假设你有以下数据要删除:

FirstName  | LastName  | CompanyName  | City       | State
----------------------------------------------------------
Bob        |  Smith    |  ABC         | New York   |  NY
Bob        |  Smith    |  ABC         | Newark     |  NJ
Jane       |  Adams    |  ACME        | Seattle    |  WA 

因此,我假设你的意思是他们各自的城市和国家"表示"一个随机选择的城市和州从相应的行",这实际上使问题变得困难:

WITH [Names] AS (
    SELECT DISTINCT [FirstName], [LastName], [CompanyName]
    FROM Table1
)
INSERT INTO Table2 ([FirstName], [LastName], [CompanyName], [City], [State])
SELECT [FirstName], [LastName], [CompanyName], [City], [State]
FROM [Names]
CROSS APPLY
(
    SELECT TOP 1 [City], [State]
    FROM Table1
    WHERE Table1.[FirstName] = [Names].[FirstName]
    AND Table1.[LastName] = [Names].[LastName]
    AND Table1.[CompanyName] = [Names].[CompanyName]
) [FirstRespectiveAddress]

如果"某些随机行"不适合你,你必须明确定义每个人要采取的城市和州。

答案 1 :(得分:1)

如果您没有针对每个FirstName / LastName / CompanyName组合选择哪个城市/州的偏好,您可以使用LEFT JOIN相当简单地执行此操作,而不依赖于任何特定的SQL方言;

INSERT INTO Table2
SELECT DISTINCT t1.FirstName, t1.LastName, t1.CompanyName, t1.City, t1.State
FROM Table1 t1
LEFT JOIN Table1 d
ON t1.FirstName = d.FirstName AND t1.LastName  = d.LastName AND
   t1.CompanyName = d.CompanyName AND (t1.City > d.City OR t1.State > d.State)
WHERE d.FirstName IS NULL;

SQLfiddle demo

查询将基本上采用没有更大(按排序顺序)城市/州组合的所有行(每个FirstName / LastName / CompanyName组合)并显示它们。

答案 2 :(得分:0)

你可以创建一个循环,开始传输每一行和每个插入查询之前的条件如果条件检查另一个查询的行数,检查是否存在要插入的Col的值。 例如,从表中选择Col,Col,Col,其中Col =要插入的值,它适用于您需要多少cols。比make mysql_num_rows,如果var大于零,它已经在表中,你不插入它。 希望你能理解。

答案 3 :(得分:0)

此查询应仅为您提供具有[FirstName],[LastName]和[CompanyName]的唯一组合的行:

SELECT t1.FirstName, t1.LastName, t1.CompanyName, t1.City, t1.State
FROM Table1 t1
INNER JOIN (
   SELECT FirstName, LastName, CompanyName
   FROM Table1
   GROUP BY FirstName, LastName, CompanyName
   HAVING COUNT(*) = 1
) t2 ON t1.FirstName = t2.FirstName AND t1.LastName = t2.LastName AND t1.CompanyName = t2.CompanyName