2017-05-12 23 views
-2

Oracle 11gテーブルで一意の値を持つ列を見つける方法。 テーブルに作成された制約はありません。ですから、制約を作成するためにテーブル内にユニークな列を見つける必要があります。 これを行うSQLは高く評価されます:)テーブル内で一意の値を持つ列を見つける方法

私は本当になぜ質問が落ちるのか分かりません。私はレガシーシステムから1200テーブルあり、実際の鍵はありません。だから私は各テーブルから一意の値を持つ少なくとも1つの列を見つけることを試みている、私はカウント(*)> 1クエリを持つことによって通常のグループを使用してこの列を列で行うことはできません。私はテーブル内のすべての列に対してそれを行うクエリを探しています。

+0

スキーマ定義、サンプルデータ、および予想される結果などの詳細情報を提供できますか。このような質問をすることで、多くの助けを得ることはありません。また、これまでに何を試しましたか?あなたの作品を見せてください。 –

+0

おそらく "一意の値を持つ列"を定義する必要があります –

+0

私が試したクエリは以下に示しますが、これは機能しません。私は一意の値を持つテーブルのすべての列が必要です。これらの列に対して一意の制約を作成する必要があります。 –

答えて

0
CREATE OR REPLACE PROCEDURE unique_columns (p_schema IN VARCHAR2) 
AS 
    l_cmd VARCHAR2 (200); 
    l_cnt INTEGER; 
BEGIN 
    FOR eachcol IN ( SELECT * 
         FROM all_tab_cols 
         WHERE owner = p_schema 
        ORDER BY table_name, column_name) 
    LOOP 
     l_cmd  := 'select count(*) c from (select count(*) c, ' 
         || eachcol.column_name 
         || ' from ' 
         || eachcol.owner 
         || '.' 
         || eachcol.table_name 
         || ' having count(*) > 1)'; 

     EXECUTE IMMEDIATE l_cmd INTO l_cnt; 

     IF l_cnt = 0 
     THEN 
      DBMS_OUTPUT.put_line (
       'Unique: ' || eachcol.owner || '.' || eachcol.table_name || '.' || eachcol.column_name 
      ); 
     END IF; 
    END LOOP; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.put_line (l_cmd); 
     RAISE; 
END; 

EXEC unique_columns('BRIANL'); 

Unique: BRIANL.CATS.CATNAME 
Unique: BRIANL.CATS.ID 
Unique: BRIANL.CATS.USERID 
Unique: BRIANL.DELETEME_TABLE.A 
Unique: BRIANL.DELETEME_TABLE.B 
Unique: BRIANL.DELETEME_TBL.A  
Unique: BRIANL.DELETEME_TBL.B 
Unique: BRIANL.DELETEME_TBL.C 
Unique: BRIANL.DELETME_TBL.DUMMY 
Unique: BRIANL.DIR_LIST.FILENAME 
関連する問題