डेटाटाइप संख्या/पूर्णांक के कॉलम नाम को आउटपुट करने के लिए अनिवार्य रूप से निम्न क्वेरी की आवश्यकता है? मैं आउटपुट को केवल एक विशिष्ट डेटा प्रकार तक कैसे सीमित करूं?

select column_name, num_distinct 
from all_tab_col_statistics
where table_name = 'MY_TABLE_NAME'
order by num_distinct desc
fetch first row with ties;

मैं इस तथ्य से अवगत हूं कि ऐसा करने में ALL_TAB_COLS तालिका के साथ जुड़ना शामिल है, लेकिन मुझे यकीन नहीं है कि मैं अपनी वर्तमान क्वेरी को देखते हुए इसे कैसे लागू करूंगा।

किसी भी सहायता की सराहना की जाएगी!

0
asdfghjkl9999 20 जिंदा 2020, 09:14

1 उत्तर

सबसे बढ़िया उत्तर

ALL_TAB_COL_STATISTICS से ALL_TAB_COLUMNS में शामिल हों क्योंकि इसमें कॉलम के डेटाटाइप होते हैं।

यदि आप कई तालिकाओं को शामिल करना चाहते हैं, तो IN खंड का उपयोग करने का एक आसान तरीका है और उन सभी तालिकाओं को नाम दें जिनमें आप रुचि रखते हैं।

उदाहरण के लिए:

SQL> select c.table_name, c.column_name, c.data_type, s.num_distinct
  2  from all_tab_columns c join all_tab_col_statistics s on
  3    s.table_name = c.table_name and s.column_name = c.column_name
  4  where c.table_name in ('EMP', 'DEPT')
  5    and c.data_type in ('NUMBER', 'VARCHAR2')
  6  order by c.table_name, c.column_name;

TABLE_NAME COLUMN_NAME     DATA_TYPE       NUM_DISTINCT
---------- --------------- --------------- ------------
DEPT       DEPTNO          NUMBER                     4
DEPT       DNAME           VARCHAR2                   4
DEPT       LOC             VARCHAR2                   4
EMP        COMM            NUMBER                     4
EMP        DEPTNO          NUMBER                     3
EMP        EMPNO           NUMBER                    14
EMP        ENAME           VARCHAR2                  14
EMP        JOB             VARCHAR2                   5
EMP        MGR             NUMBER                     6
EMP        SAL             NUMBER                    12

10 rows selected.

SQL>

यदि आप केवल उन स्तंभों का चयन करना चाहते हैं जिनमें प्रत्येक तालिका में उच्चतम NUM_DISTINCT मान हैं, तो वर्तमान क्वेरी का उपयोग CTE (सामान्य तालिका अभिव्यक्ति उर्फ ​​द विद फैक्टरिंग क्लॉज), विश्लेषणात्मक फ़ंक्शन (जैसे RANK) के रूप में करें। अपनी रूचि के अनुसार खोजें। कुछ इस तरह:

SQL> with data as
  2    (select c.table_name, c.column_name, c.data_type, s.num_distinct,
  3            --
  4            rank() over (partition by c.table_name order by s.num_distinct desc) rnk
  5       from all_tab_columns c join all_tab_col_statistics s on
  6         s.table_name = c.table_name and s.column_name = c.column_name
  7       where c.table_name in ('EMP', 'DEPT')
  8         and c.data_type in ('NUMBER', 'VARCHAR2')
  9    )
 10  select table_name, column_name, data_type, num_distinct
 11  from data
 12  where rnk = 1;

TABLE_NAME COLUMN_NAME     DATA_TYPE       NUM_DISTINCT
---------- --------------- --------------- ------------
DEPT       LOC             VARCHAR2                   4
DEPT       DNAME           VARCHAR2                   4
DEPT       DEPTNO          NUMBER                     4
EMP        ENAME           VARCHAR2                  14
EMP        EMPNO           NUMBER                    14

SQL>

इससे लगता है

  • तालिका DEPT में, 3 कॉलम हैं जो समान MAX मान साझा करते हैं (4)
  • तालिका ईएमपी में, ऐसे 2 कॉलम हैं (अधिकतम मान = 14)
1
Littlefoot 20 जिंदा 2020, 11:12