2016-04-08 9 views
1

こんにちは私は名前がCategoryで、2行挿入された表を作成しています。Oracle Xpress Editionでの問合せの結合

このテーブルを結合すると、複数の行が出力されます。

私の表がある: - カテゴリ

CREATE TABLE Category(
     ID int NOT NULL Primary key, 
     Code varchar(50), 
     Name varchar(200), 
     Notes varchar(500), 
     Image1 varchar(250), 
     Image2 varchar(250), 
     Image3 varchar(250), 
     CreatedBy int NOT NULL, 
     PageTitle varchar(100), 
     MetaName varchar(200), 
     MetaDescription varchar(500), 
     MetaKeywords varchar(500), 
     ERPReferencesSysteID int, 
     ERPReferencesID int, 
     AssignedTo int, 
     Status int); 

挿入クエリ: -

insert into Category values (902,'Code2', 'NAME2','Note2', 'Image12', 
    'Image22','Image32', 2016, 'PageTitle2','MetaName2', 'MetaDescription2', 
    'MetaKeyword2',02, 08, 2,1); 

クエリに参加マイ: -

SELECT DISTINCT info.COLUMN_NAME AS NAME, info.OWNER AS TABLESCHEMA, 
info.TABLE_NAME,UIC.COLUMN_POSITION AS POSITION,info.NULLABLE AS ISNULLABLE, 
info.DATA_TYPE AS DATATYPE,tc.CONSTRAINT_TYPE AS CONSTRAINTTYPE, 
tc.R_OWNER AS REFERENCESCHEMA FROM all_tab_columns 
info join all_constraints tc on info.TABLE_NAME = tc.TABLE_NAME 
join user_cons_columns rk on info.TABLE_NAME = rk.TABLE_NAME 
join USER_IND_COLUMNS UIC on UIC.TABLE_NAME = info.TABLE_NAME 
where info.TABLE_NAME= 'CATEGORY' AND info.owner ='SAN' ORDER BY 
UIC.COLUMN_POSITION ASC; 

私は、これは、クエリの行を結合実行していたときが表示されています複数回。

このクエリで何が間違っていますか?

+0

期待する出力と実際に得られる結果を表示するのに役立ちます。 –

答えて

0

テーブルを結合するのにINNER JOINを使用してください。

SELECT DISTINCT info.COLUMN_NAME AS NAME, info.OWNER AS TABLESCHEMA, 
info.TABLE_NAME,UIC.COLUMN_POSITION AS POSITION,info.NULLABLE AS ISNULLABLE, 
info.DATA_TYPE AS DATATYPE,tc.CONSTRAINT_TYPE AS CONSTRAINTTYPE, 
tc.R_OWNER AS REFERENCESCHEMA 
FROM all_tab_columns info 
INNER JOIN all_constraints tc ON info.TABLE_NAME = tc.TABLE_NAME 
INNER JOIN user_cons_columns rk ON info.TABLE_NAME = rk.TABLE_NAME 
INNER JOIN USER_IND_COLUMNS UIC ON UIC.TABLE_NAME = info.TABLE_NAME 
WHERE info.TABLE_NAME = 'CATEGORY' 
AND info.owner ='SAN' 
ORDER BY UIC.COLUMN_POSITION ASC; 
+0

: - 私も2回見せているすべての行を試しました... – Sanjiv

+0

これらはすべて内部結合です。これがデフォルトです。 (Oracleではとにかく) –

+0

@AlexPooleそれでは、その解決策は何ですか? – Sanjiv

0

テーブルには3つの制約があります。主キーと2つの非NULL制約。これらのうちの1つは、主キー列が暗黙的にnullではないため、冗長です。

したがって、user_cons_columnsには3つの行があります。そのうちの2つはidです。

SELECT uc.constraint_name, uc.constraint_type, ucc.column_name 
FROM user_constraints uc 
JOIN user_cons_columns ucc ON ucc.constraint_name = uc.constraint_name 
WHERE uc.table_name = 'CATEGORY'; 

CONSTRAINT_NAME    C COLUMN_NAME   
------------------------------ - -------------------- 
SYS_C00110620     C ID     
SYS_C00110621     C CREATEDBY   
SYS_C00110622     P ID     

1つのidためuser_ind_columnsの行が、他の非NULL制約であるcreatedbyためない一つは、もあります。あなたは、結果セットに2列を取得するようuser_cons_columns

SELECT ui.index_name, uic.column_name 
FROM user_indexes ui 
JOIN user_ind_columns uic ON uic.index_name = ui.index_name 
WHERE ui.table_name = 'CATEGORY'; 

INDEX_NAME      COLUMN_NAME   
------------------------------ -------------------- 
SYS_C00110622     ID     

id行の両方が、user_ind_columns中1で一致しています。 distinctは、結果セットに制約タイプを含めるので、PとCのために別々の行が表示されるため、役に立たない。

また、結合にcolumn_nameは含まれていません。 all_tab_columnsの16行すべてが3つの制約とその列すべてに結合しています。

Pの制約のために、単一の行を取得します
SELECT distinct atc.column_name AS NAME, atc.owner AS tableschema, 
atc.table_name, aic.column_position AS position, atc.nullable AS isnullable, 
atc.data_type AS datatype, ac.constraint_type AS constrainttype, 
ac.r_owner AS referenceschema 
FROM all_tab_columns atc 
JOIN all_constraints ac 
ON ac.owner = atc.owner 
AND ac.table_name = atc.table_name 
JOIN all_cons_columns acc 
ON acc.table_name = atc.table_name 
AND acc.column_name = atc.column_name 
JOIN all_ind_columns aic 
ON aic.table_owner = atc.owner 
AND aic.table_name = atc.table_name 
AND aic.column_name = atc.column_name 
WHERE atc.table_name= 'CATEGORY' 
AND atc.owner = 'SAN' 
AND ac.constraint_type = 'P' 
ORDER BY aic.column_position ASC; 

:あなたが使用しているように、内側合流あなただけの主キーとそのインデックスを表示したいので、これはそれを行うには長いったらしい方法であるように思われるように見えますID列。すべての列を表示する場合は、外部結合が必要です。

+0

: - 私はクエリーで試してみましたが、まだ問題はあります。 3列目に同じ列名が表示されます。 – Sanjiv

関連する問題