3

あるテーブルから別のテーブルにデータを転送する必要があります。2 番目のテーブルには主キー制約があります (最初のテーブルには制約がありません)。それらは同じ構造を持っています。私が望むのは、テーブル A からすべての行を選択し、重複行なしでテーブル B に挿入することです (行が重複していない場合、最初に見つけた行のみを取得したい)

例 :

MyField1 (PK)   |   MyField2 (PK)   |   MyField3(PK)   |   MyField4   |   MyField5  

----------

1               |   'Test'          |   'A1'           |   'Data1'    |   'Data1'  
2               |   'Test1'         |   'A2'           |   'Data2'    |   'Data2'  
2               |   'Test1'         |   'A2'           |   'Data3'    |   'Data3'  
4               |   'Test2'         |   'A3'           |   'Data4'    |   'Data4'

ご覧のとおり、2 行目と 3 行目は同じ pk キーを取得していますが、MyField4 と MyField5 のデータは異なります。したがって、この例では、1 行目、2 行目、4 行目が必要です。2 番目の重複であるため、3 番目のものではありません (MyField4 と MyField5 に異なるデータが含まれていても)。

単一の選択でそれを行うにはどうすればよいですか?

どうも

4

5 に答える 5

4

まず、行を「最初」にするものを定義する必要があります。任意の定義を作成し、必要に応じて必要に応じて SQL を変更できます。この例では、"first" が MyField4 の最小値であり、それらが等しい場合は MyField5 の最小値であると想定しています。また、5 つの列すべてが同一である可能性も考慮されます。

SELECT DISTINCT
     T1.MyField1,
     T1.MyField2,
     T1.MyField3,
     T1.MyField4,
     T1.MyField5
FROM
     MyTable T1
LEFT OUTER JOIN MyTable T2 ON
     T2.MyField1 = T1.MyField1 AND
     T2.MyField2 = T1.MyField2 AND
     T2.MyField3 = T1.MyField3 AND
     (
          T2.MyField4 > T1.MyField4 OR
          (
               T2.MyField4 = T1.MyField4 AND
               T2.MyField5 > T1.MyField5
          )
     )
WHERE
     T2.MyField1 IS NULL

ソース テーブルで重複していないが、宛先テーブルに既に存在する PK も考慮したい場合は、それも考慮する必要があります。

于 2009-02-10T01:22:15.937 に答える
2

あなたのデータベースは何ですか?オラクルでは、あなたは言うことができます

SELECT FROM your_table
WHERE rowid in
(SELECT MIN(rowid)
 FROM your_table
 GROUP BY MyField1, MyField2, MyField3);

同じ PK を持つ行のどれが「最初」と見なされるかは、多少不確実であることに注意してください。特定の順序を課す必要がある場合は、他の列でさらに並べ替える必要があります。

于 2009-02-10T00:46:11.500 に答える
1

それはあなたが探しているものに依存します。

JOIN+ WHERE NULLNOT IN、およびの使用には大きな違いがありNOT EXISTS、パフォーマンスも含まれます。これは、より大きなデータ セットでより重要になります。

( NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULLを参照してください。)

リンクされた記事に示されている 3 つの方法は非常に簡単です。

于 2012-01-11T22:12:21.533 に答える
0
CREATE TABLE #A(
ID INTEGER IDENTITY,
[MyField1] [int] NULL,
[MyField2] [varchar](10) NULL,
[MyField3] [varchar](10) NULL,
[MyField4] [varchar](10) NULL,
[MyField5] [varchar](10) NULL
) 

INSERT INTO #A (MyField1,MyField2,MyField3,MyField4,MyField5) SELECT * FROM A

insert into B 
   select MyField1,MyField2,MyField3,MyField4,MyField5 from #A a1 
    where not exists (select id from #A a2 where a2.MyField1 = a1.MyField1 and a2.ID < a1.ID)

DROP TABLE #A

また

insert into b
  select distinct * from a a1 
    where not exists (
  select a2.MyField1 from a a2 where a1.MyField1 = a2.MyField1 and 
       (a1.MyField2 < a2.MyField2 or a1.MyField3 < a2.MyField3 
        or a1.MyField4 < a2.MyField5 or a1.MyField5 < a2.MyField5))
于 2009-02-10T09:04:37.760 に答える