2016-04-08 22 views
1

Merhaba İki satır eklenmiş, Category adında bir tablo oluşturuyorum.Oracle Xpress Edition'da Sorguya Katıl

Bu tabloya katıldığımda, çıktı çok sayıda satır yazdırıldı.

Benim Tablo geçerli: - Kategori

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); 

takın Sorgu: -:

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; 

Bu sorgu satırları katılmak yürütme am zaman gösteriyoruz -

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

Sorgu Üyelik listem bir kaç sefer.

Bu sorguda yanlış yapıyorum?

+0

Beklediğiniz çıktıyı ve gerçekten aldığınız şeyi göstermeye yardımcı olur. –

cevap

0

INNER JOIN'in Masalarınızı birleştirmek için kullanın.

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

: - Ben de denedim .. tüm satırlar iki kez gösteriliyor ... – Sanjiv

+0

Hepsi bir arada; Bu varsayılan. (Her neyse Oracle'da) –

+0

@AlexPoole O zaman bunun çözümü nedir? – Sanjiv

0

Tabloda üç kısıtlama var; birincil anahtar ve iki boş olmayan kısıtlama. Bunlardan biri birincil anahtar sütunu olduğu gibi gereksizdir zaten null değildir.

user_cons_columns'da üç satır var. Bunlardan ikisi id içindir.

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     

bir id için user_ind_columns satır, ancak diğer boş değil kısıtlamayı olan createdby için bir değil, vardır. Eğer sonuç kümesindeki iki sıra olsun böylece user_cons_columns yılında

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 satır Hem user_ind_columns yılında biriyle eşleştirme. distinct, sonuç kümesindeki kısıtlama türünü dahil ettiğiniz için yardımcı olmadığından, P ve C için ayrı satırlar görüyorsunuz.

Ayrıca, katılmalara column_name'u dahil etmiyorsunuz; Yani all_tab_columns'daki 16 satırın tümü, tüm üç kısıtlamaya ve sütunlarına katılıyor. Eğer iç kullandığınız gibi sadece birincil anahtar ve dizinini göstermek istiyorum görünüyor katılır, bu nedenle bu bunu yapmak için uzun soluklu bir yol olarak görünüyor:

P kısıtı için tek bir satır alır
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 sütunu. Dış birleştirmelere ihtiyacınız olan tüm sütunları göstermeyi amaçlıyorsanız.

+0

: - Sorgu ile denedim ama hala sorun var. Şimdi aynı sütun adı gösteren 3 satır. – Sanjiv