0

Table1 という名前のテーブルがあり、その中に大量のジャンク データがあり、一意の識別子の列はありません。

Table1 からいくつかの列を選択し、そのデータを Table2 に転送したいと考えています。ただし、3 つの列からの重複したエントリが挿入されないようにしたいと考えています。

転送する必要がある列[FirstName][LastName][CompanyName][City]、 を含む行があると[State]します。[FirstName][LastName]、およびの一意の組み合わせを持つ行のみを、それぞれの および[CompanyName]とともに Table2 にコピーする必要があります。[City][State]

4

4 に答える 4

2

スクラブしたい次のようなデータがあると仮定します。

名 | 姓 | 会社名 | 都市 | 州
-------------------------------------------------- --------
ボブ | スミス | ABC | ニューヨーク | ニューヨーク | ニューヨーク
ボブ | スミス | ABC | ニューアーク | ニュージャージー州
ジェーン | アダムス | アクメ | シアトル | ワ

したがって、「それぞれの市と州」は「対応する行からランダムに選択された 1 つの市と州」を意味すると想定しています。これが実際に問題を困難にしています。

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 デモ.

クエリは基本的に、(並べ替え順で) 都市/州の組み合わせが大きくないすべての行 (FirstName/LastName/CompanyName の組み合わせごと) を取得し、それらを表示します。

于 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 に答える