0

次のスキーマに基づいて、データの多いテーブル (サイズが約 1 TB) があります。

CREATE TABLE my_table(
  col1  character varying, 
  col2 character varying, 
  col3 character varying
);

前述のテーブルには、次の形式のデータが含まれています。

col1     col2    col3
<abc1>   <def1>  <ghi1>
<abc1>   <g1>    <g2>
<g3>     <g1>    <g4>

今、私がやりたいのは、テーブルのすべての一意の文字列( 、およびmy_tableに存在する) を整数値にマップする辞書 (別のテーブル) を作成することです。例えば:col1col2col3

<abc1>    1
<def1>    2
<ghi1>    3
<g1>      4
<g2>      5
<g3>      6
<g4>      7

選択したプログラミング言語 (Python など) を使用してこれを実行できることはわかっています。私が知りたいのは、純粋な SQL を使用してこのようなことを達成できるかどうかです。

4

3 に答える 3

1

わかりました、私はこれについて SQL Server の観点から来ていますが、概念はほとんど同じです。自動インクリメントキーを提供するようSERIALに、SQL Serverと同等であることは私の理解です。IDENTITY私の解決策は次のようになります。

CREATE TABLE DistinctStrings
(
   ID SERIAL NOT NULL、
   文字列 CHARACTER VARYING NOT NULL
)

そのテーブルを保持したいと思うので、明らかにデータベースの一部であり、入力するたびに再作成されるわけではありません。

このようにこのテーブルに挿入します

INSERT INTO DistinctStrings (文字列)
my_table UNION から col1 を選択
my_table UNION から col2 を選択
my_table から col3 を選択

UNION( とは対照的に) を使用すると、UNION ALL探している独自性が得られます。を使用するSERIALと、ID が付与されます。

于 2013-10-16T01:48:27.443 に答える
1
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;

CREATE TABLE bigstrings
        ( col1 varchar
        , col2 varchar
        , col3 varchar
        );

INSERT INTO bigstrings(col1, col2, col3) VALUES
 ('abc1','def1','ghi1')
,('abc1','g1','g2')
,('g3','g1','g4')
        ;

CREATE TABLE allstrings
        ( num BIGSERIAL NOT NULL PRIMARY KEY
        , string varchar NOT NULL UNIQUE
        );

CREATE TABLE nostrings
        ( col1 BIGINT REFERENCES allstrings(num)
        , col2 BIGINT REFERENCES allstrings(num)
        , col3 BIGINT REFERENCES allstrings(num)
        );

INSERT INTO allstrings( string)
SELECT DISTINCT col1 FROM bigstrings bs
 -- not needed on empty allstrings table.
 -- WHERE NOT EXISTS ( SELECT * FROM allstrings nx WHERE nx.string = bs.col1)
        ;

INSERT INTO allstrings( string)
SELECT DISTINCT col2 FROM bigstrings bs
WHERE NOT EXISTS ( SELECT * FROM allstrings nx WHERE nx.string = bs.col2)
        ;

INSERT INTO allstrings( string)
SELECT DISTINCT col3 FROM bigstrings bs
WHERE NOT EXISTS ( SELECT * FROM allstrings nx WHERE nx.string = bs.col3)
        ;

INSERT INTO nostrings(col1,col2,col3)
SELECT s1.num, s2.num, s3.num
FROM bigstrings bs
JOIN allstrings s1 ON s1.string = bs.col1
JOIN allstrings s2 ON s2.string = bs.col2
JOIN allstrings s3 ON s3.string = bs.col3
        ;

SELECT * FROM nostrings;

結果:

 col1 | col2 | col3 
------+------+------
    2 |    3 |    6
    2 |    4 |    7
    1 |    4 |    5
(3 rows)
于 2013-10-16T11:44:19.767 に答える