0

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

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

假设我有一行需要传输的列[FirstName], [LastName], [CompanyName],[City]和。我只希望将具有、和[State]的唯一组合的行连同它们各自的和一起复制到 Table2 中。[FirstName][LastName][CompanyName][City][State]

4

4 回答 4

2

我假设您有如下数据要清理:

名字 | 姓氏 | 公司名称 | 城市 | 状态
-------------------------------------------------- --------
鲍勃 | 史密斯 | 美国广播公司 | 纽约 | 纽约
鲍勃 | 史密斯 | 美国广播公司 | 纽瓦克 | 新泽西州
简 | 亚当斯 | ACME | 西雅图 | 西澳

因此,我假设您的意思是“他们各自的城市和州”是指“从相应行中随机选择的一个城市和州”,这实际上使问题变得困难:

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]

如果“一些随机行”对您不起作用,您将必须明确定义每个人要选择哪个城市和州。

于 2013-01-20T07:45:47.533 回答
1

如果您对每个组合选择哪个城市/州没有任何偏好FirstName / LastName / CompanyName,您可以使用 aLEFT 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 演示

该查询将基本上采用所有没有更大(按排序顺序)城市/州组合的行(每个名字/姓氏/公司名组合)并显示它们。

于 2013-01-20T07:58:28.450 回答
0

您可以创建一个循环,开始传输每一行并在每个插入查询之前放置 if 条件检查另一个查询的行数,该查询检查您插入的 Col 的值是否存在。例如,从表中选择 Col,Col,Col,其中 Col=您要插入的值,它适用于您需要多少列。比制作​​ mysql_num_rows,如果 var 大于零,它已经在表中,你不要插入它。希望你明白。

于 2013-01-20T07:53:41.687 回答
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
于 2013-01-20T08:07:16.110 回答