Select tables with a number of corresponding columns

Hi guys

I need to find a list of tables with columns in common.

So basically I need a list of tables and tables that have 3 or more column in common with her, and what are these columns.

This could take the form of pairs of tables, IE table A table B on columns 1,2,3 games
Table of an array of matches C on columns 1,3,4

or it could be games table A table B and C columns 1,2,3 etc.

I think I do with PL/SQL, what I can do - but I was wondering if this kind of thing is possible with just an SQL statement - if any of you have done it before and you have some SQL, which would be a great help.

Thank you very much

Scott

Well, most of the work is done.
'Just', you need to add an aggregation function to present the list of corresponding columns.

In 11.2, it has LISTAGG:

SELECT a.table_name tab1,
       b.table_name tab2,
       count(*) match_count,
       listagg(a.column_name,',') within group(order by a.column_id) col_list
FROM user_tab_columns a
     JOIN user_tab_columns b ON a.column_name = b.column_name AND a.table_name != b.table_name
GROUP BY a.table_name, b.table_name
HAVING count(*) > 2
;

For older versions, other techniques are summarized here:
http://www.Oracle-base.com/articles/Misc/StringAggregationTechniques.php

Tags: Database

Similar Questions

  • I have a table with a city of the column. Values are 'delhi' and 'hyderabad '.

    I have a table with a city of the column. Values are 'delhi' and 'hyderabad '.

    as

    ID |   City

    ---------------------------

    1     |  Delhi

    ----------------------------

    2     |  Hyderabad

    Now, I have to update Delhi and Hyderabad Hyderabad with Delhi.

    How to do this?

    Hi Indi,

    (1) why do you want what it? Requirements of companies?

    (2) how much these values you want to reverse? Is it only "Delhi" and "Hyderabad", or there is a list, or other logic?

    Update your_table

    Set city = decode (lower (city), 'delhi', 'Hyderabad', 'hyderabad', 'Delhi')

    where lower (city) ('Delhi', 'hyderabad');

    Does that help?

  • Matrix of distances: selection of values with the number of the column as a variable

    Hi all

    You wonder if SQL can do natively, let's go.

    I have a static table with the same amount of rows and columns, that changes forever; It represents the distances between locations (e.g. countries).
    It's basically a distance matrix (you can find a good example on Wikipedia ).

    My SQL statement must extract the distances of this matrix, based on the IDS of countries located in another table.
    Select a field is simple:

    SELECT * from cdistances where countryid =
    (select countryid from countries where upper (country) = upper (& getcountry));

    When I run the present, I get a line of all distances to all countries of the country I go when asked. But I would limit the outcome of a country of destination that I entered.

    Of course, a CASE statement would solve this nicely, but since we are talking more than 200 countries, which will become unmanageable.

    Another method that I approached is to use a variable as a column, as below:

    SELECT & getdestination of cdistances where countryid =
    (select countryid from countries where upper (country) = upper (& getcountry));

    It works well when I get directly the column identifier (manually from the keyboard) but I would like to automate even further.
    My names of columns in the matrix of distances are named as follows:
    countries1, countries2, countries3... country200 - where the number ID the real country, preceded by the constant string 'country '.
    So I tried to define a variable as a concat between 'country' and another variable:
    def getd2 = concat ("D2C", & testcountryid);
    Of course, it does not; the output of the script is:

    old: def getd2 = concat ('country', & testcountryid)
    New: def getd2 = concat ("country", 12)

    where I expected to be 'country12.

    I'm so little loss of thoughts. Maybe I'm pushing my train of thought in the wrong way, so I guess the general question would be: how to select a specific column of a table based on information outside the SQL statement dynamically?

    Hello

    I'm still confused.
    Is your table called chessking or testdistances, or you have 2 separate tables?

    I'm guessing that your single table is testdistances, and you want to pass a list of countryids, such as that of 3.1 to a query and get results as follows:

    `COUNTRYID  DISTANCE3  DISTANCE1
    ---------- ---------- ----------
             1         18         15
             3         13          1
    

    If so:

    DEFINE     country_list = "3,1"
    
    -- Preliminary Query, to set column_list
    COLUMN     column_list_col     NEW_VALUE column_list
    
    SELECT     'distance' || REPLACE ( '&country_list'
                               , ','
                         , ',distance'
                         )          AS column_list_col
    FROM    dual;
    
    -- Main Query
    SELECT     countryid
    ,     &column_list
    FROM     testdistances
    WHERE     countryid     IN (&country_list)
    ;
    

    Sorry, I'm out of time now. I'll explain more in a few hours.

  • Add a table with the number of lines and columns JS

    Hello

    Simple question: what is the syntax for adding a table with a specified number of rows and columns? I don't get it. (I don't know how to add them later, but I want to do when I create the table). Here is the entry in the ESTK:

    Tables.Add (to: LocationOptions, reference: all, withProperties: Object): array

    Creates a new table.

    (optional): Data Type: LocationOptions, by default: LocationOptions.UNKNOWN
    The location of the new table to the object within the container object or reference. (Optional)

    Reference: Data Type: no
    The reference object. Note: Required when the value specifies before or after. Can accept: Table, XmlStory, XMLElement, TextFrame, text, character, Word, line, paragraph, TextColumn, PointInsertion, story, cell or TextStyleRange. (Optional)

    withProperties: Data Type: object
    Initial values for the properties of the new Table (optional)

    Thank you

    Ariel

    After much experimentation, I found this works:

    t = app.selection [0].tables.add (LocationOptions.AT_BEGINNING, undefined, {columnCount:2, headerRowCount:1, bodyRowCount:5, footerRowCount:3});})

  • CRUD for tables with large number of columns

    Hello

    I work for a government agency in Colombia, and we do a poll with about 1200 variables. Our database model has few paintings, but they have a large number of columns. Our Oracle 11 g database is, and we do not use Oracle APEX. I've read about APEX and it seems to be useful to generate quick forms and reports. However, I would like to know if it is possible to generate CRUD for tables with many columns, and that would be the best way to do it.

    Thanks in advance.

    Carlos.

    With the help of 250 point on a single page is actually really bad for the user experience. I would probably be it cut into pieces and using several pages to guide the customer through it as a workflow.

    You could also add some pop-up windows which includes some elements of your table, just saved on other pages. But I probably don't like that.

    Tobias

  • How to update the table with the number management

    Hello

    I need as there is a loc_tab of the created table as below,

    CREATE TABLE loc_tab
    (
    Country_ID NUMBER,
    country_code VARCHAR2 (3),
    country_name VARCHAR2 (50).
    State_ID NUMBER,
    state_code VARCHAR2 (3),
    state_name VARCHAR2 (50).
    city_id NUMBER,
    city_code VARCHAR2 (3),
    city_name VARCHAR2 (50)
    );

    I inserted records like below,
    COUNTRY_ID     COUNTRY_CODE     COUNTRY_NAME     STATE_ID     STATE_CODE     STATE_NAME     CITY_ID     CITY_CODE     CITY_NAME
    
              IND          INDIA                    TN          TAMIL NADU          CHN          CHENNAI
              IND          INDIA                    TN          TAMIL NADU          TRI          TRICHY
              IND          INDIA                    TN          TAMIL NADU          CMT          COIMBATORE
              IND          INDIA                    TN          TAMIL NADU          MDU          MADURAI
              IND          INDIA                    AP          ANDHRA PRADESH          HYD          HYDERABAD
              IND          INDIA                    AP          ANDHRA PRADESH          SEC          SECUNDRABAD
              AUS          AUSTRALIA               QLD          QUEENSLAND          BRI          BRISBANE
              AUS          AUSTRALIA               TAS          TASMANIA          HB          HOBART
              AUS          AUSTRALIA               TAS          TASMANIA          CCE          CITY OF CLEARANCE
              AUS          AUSTRALIA               TAS          TASMANIA          BUR          BURNIE
    Now, I wanted to update the table such that all ID columns are updated with running number.

    Each ID columns should get incremented so that, for Country_ID column corresponding to "India" If country_id is 1, that there must be one for all the lines with the name as "India". Likewise for "Australia".

    In the case of State, she also has the same logic with numbers repeated until the very name of the State comes.

    For the city, it of course will hold separate ID only because the name of the city will not get duplicated.

    This update must be done in the normal way using simple SQL such as no PLSQL don't like looping, etc... is involved.

    Here are the contents of the table, and that's how the table should be updated,
    COUNTRY_ID     COUNTRY_CODE     COUNTRY_NAME     STATE_ID     STATE_CODE     STATE_NAME     CITY_ID     CITY_CODE     CITY_NAME
                                            
    1          IND          INDIA          1          TN          TAMIL NADU     1     CHN          CHENNAI
    1          IND          INDIA          1          TN          TAMIL NADU     2     TRI          TRICHY
    1          IND          INDIA          1          TN          TAMIL NADU     3     CMT          COIMBATORE
    1          IND          INDIA          1          TN          TAMIL NADU     4     MDU          MADURAI
    1          IND          INDIA          2          AP          ANDHRA PRADESH     1     HYD          HYDERABAD
    1          IND          INDIA          2          AP          ANDHRA PRADESH     2     SEC          SECUNDRABAD
    2          AUS          AUSTRALIA     1          QLD          QUEENSLAND     1     BRI          BRISBANE
    2          AUS          AUSTRALIA     2          TAS          TASMANIA     1     HB          HOBART
    2          AUS          AUSTRALIA     2          TAS          TASMANIA     2     CCE          CITY OF CLEARANCE
    2          AUS          AUSTRALIA     2          TAS          TASMANIA     3     BUR          BURNIE
    Thank you and best regards,
    Shiva
  • Insert the problem using a SELECT table with an index by TRUNC function

    I came across this problem when you try to insert a select query, select returns the correct results, but when you try to insert the results into a table, the results are different. I found a work around by forcing a selection order, but surely this is a bug in Oracle as how the value of select statements may differ from the insert?

    Platform: Windows Server 2008 R2
    11.2.3 Oracle Enterprise Edition
    (I've not tried to reproduce this on other versions)

    Here are the scripts to create the two tables and the data source:
    CREATE TABLE source_data
    (
      ID                 NUMBER(2),
      COUNT_DATE       DATE
    );
    
    CREATE INDEX IN_SOURCE_DATA ON SOURCE_DATA (TRUNC(count_date, 'MM'));
    
    INSERT INTO source_data VALUES (1, TO_DATE('20120101', 'YYYYMMDD'));
    INSERT INTO source_data VALUES (1, TO_DATE('20120102', 'YYYYMMDD'));
    INSERT INTO source_data VALUES (1, TO_DATE('20120103', 'YYYYMMDD'));
    INSERT INTO source_data VALUES (1, TO_DATE('20120201', 'YYYYMMDD'));
    INSERT INTO source_data VALUES (1, TO_DATE('20120202', 'YYYYMMDD'));
    INSERT INTO source_data VALUES (1, TO_DATE('20120203', 'YYYYMMDD'));
    INSERT INTO source_data VALUES (1, TO_DATE('20120301', 'YYYYMMDD'));
    INSERT INTO source_data VALUES (1, TO_DATE('20120302', 'YYYYMMDD'));
    INSERT INTO source_data VALUES (1, TO_DATE('20120303', 'YYYYMMDD'));
    
    CREATE TABLE result_data
    (
      ID                 NUMBER(2),
      COUNT_DATE       DATE
    );
    Now, execute the select statement:
    SELECT id, TRUNC(count_date, 'MM')
    FROM source_data
    GROUP BY id, TRUNC(count_date, 'MM')
    You should get the following:
    1     2012/02/01
    1     2012/03/01
    1     2012/01/01
    Now insert in the table of results:
    INSERT INTO result_data
    SELECT id, TRUNC(count_date, 'MM')
    FROM source_data
    GROUP BY id, TRUNC(count_date, 'MM');
    Select the table, and you get:
    1     2012/03/01
    1     2012/03/01
    1     2012/03/01
    The most recent month is repeated for each line.

    Truncate your table and insert the following statement and results should now be correct:
    INSERT INTO result_data
    SELECT id, TRUNC(count_date, 'MM')
    FROM source_data
    GROUP BY id, TRUNC(count_date, 'MM')
    ORDER BY 1, 2;
    If someone has encountered this problem before, could you please let me know, I don't see what I make a mistake because the selection results are correct, they should not be different from what is being inserted.

    Published by: user11285442 on May 13, 2013 05:16

    Published by: user11285442 on May 13, 2013 06:15

    Most likely a bug in 11.2.0.3. I can reproduce on Red Hat Linux and AIX.

    You can perform a search on MOS to see if this is a known bug (very likely), if not then you have a pretty simple test box to open a SR with.

    John

  • How to move a table (with the UDT as a column) to a different schema

    I have a table that has a column of user-defined type. There is a requirement to an another schema of this table as well as the UDT. I tried to create the table as, the problem is that it uses the DFU of the original schema. Is there a way to do this?

    Ex:

    User 1:

    CREATE TYPE employee_t AS OBJECT

    (employee_id NUMBER

    , employee_name VARCHAR2 (30)

    Number of salary

    dept_id NUMBER);

    Department of CREATE TABLE

    (emp employee_t

    , Bishop varchar2 (40)

    number of dept_id

    (, dept_name varchar2 (30));

    In the example above, department table has a column called emp that is UDT.

    Now on User2, if I do the following

    Create service table in select * from user1.department. Table will be created as follows. In fact I want EMPLOYEE_T also to be moved to User2.

    Name                                      Null?    Type

    ----------------------------------------- -------- ----------------------------

    EMP                                                USER1. EMPLOYEE_T

    BISHOP VARCHAR2 (40)

    NUMBER OF DEPT_ID

    DEPT_NAME VARCHAR2 (30)

    You can use expdp and impdp - but you must include the type explicitly in your dump command, since it isn't included automatically: http://dbaharrison.blogspot.de/2013/05/expdp-of-just-table-and-type-dependents.html.

  • Impossible to delete the partitions of a table with the number of rows is zero

    Hi all

    I want to delete all partitions on all the tables in a schema having the number of lines equal to zero.

    I use the queries below to get a solution.

    Select 'EDIT '. '' || 'TABLE ' | TABLE_NAME | 'DROP '. 'PARTITION | Nom_partition from dba_tab_partitions where TABLE_OWNER = "xyz";

    Select count (*) in the table table_name partition (nom_partition).

    Edited by: 887563 October 17, 2011 13:39

    If you trust your statistics, you can simply use the stat num_rows in dba_tab_partitions:

    select *
    from dba_tab_partitions
    where table_owner = 'MY_SCHEMA'
    and num_rows = 0;
    

    But I think what you try to get some code like this:

    declare
      v_rows number;
      v_statement varchar2(500);
    begin
      for c in (select *
                from dba_tab_partitions
                where table_owner = 'MY_SCHEMA') loop
        v_statement := 'select count(*) from '||c.table_name||
                       ' partition ('||c.partition_name||') where rownum=1';
        --dbms_output.put_line(v_statement);  --for debugging
        execute immediate(v_statement)
        into v_rows;
        --dbms_output.put_line(c.table_name||' '||c.partition_name||' '||v_rows);  --for debugging
        if v_rows = 0 then
          v_statement := 'ALTER TABLE '||c.TABLE_NAME||' DROP PARTITION ' || c.PARTITION_NAME;
          dbms_output.put_line(v_statement); --shows the drop statements
          --execute immediate(v_statement); --remove comment to execute
        end if;
      end loop;
    end;
    
  • With the help of inplace column number of the column name in the SQL Select statement

    Is it possible to execute instructions select sql with the number of columns in
    place names of columns?

    Run SQL
    select AddressId,Name,City from Address
    Is it possible
    select 1,2,5 from Address
    Thanks in advance

    You can extract the names of the columns for user_tab_columns
    with

    SELECT Column_name
    FROM user_tab_columns
    where table_name = 'MY_TABLE'
    and Column_id in (1,2,5)
    

    Use dynamic SQL and then the result to get the values.

    But as others already mentioned, this wil it be given incorrect if your table is changed.

  • create table as a table with nested column type

    On my Oracle DB (11.1), I have a table with a nested as a column type (and it is a partitioned table).
    Now I need to copy partitions in a second table, and I use swap partition for it (with a table that is not partitioned as a table in step).

    But there is a problem, because as the ordinary as sql ddl:
    create table table1_stage as select * from table1 where 1=2;
    does not work when there is a table nested within a column type.
    Is it possible easy to copy its structure (and to create the table that is not partitioned, so I suppose that no dbms_metadata package would help)?


    Kind regards...

    >
    does not work when there is a table nested within a column type.
    >

    Will work indeed.

    Read this

    SQL> CREATE TYPE typtst IS TABLE OF VARCHAR2 (100);
      2
      3  /
    
    Type created.
    
    SQL> CREATE TABLE test1
      2  (
      3     col1   VARCHAR2 (100),
      4     col2   typtst
      5  )
      6  NESTED TABLE col2
      7     STORE AS list1;
    
    Table created.
    
    SQL> CREATE TABLE test2
      2  NESTED TABLE col2
      3     STORE AS list2
      4  AS
      5     SELECT * FROM test1;
    
    Table created.
    
    SQL> 
    

    G.

  • Not how to show a part of online data in a table in another table with even no column?

    I need to display the data from certain rows in a table in another table with the same numbers of columns and main table must be disabled. Could someone advice how to do this?    Data in the table are from the microprocessor and is intended the user can see and edit only some data.

    If someone can show me some advice, it will be a great help.

    Kind regards

    Annemariehoeven

    Disable a table: SetInputMode (panelHandle, controlID, 0);  ('1' to re - activate).

    Hide a table: SetCtrlAttribute (panelHandle, controlID, ATTR_VISIBLE, 0); ('1' to show it again).

    These commands are valid for each type of control.

    To extract values from the table, you can just use GetTableCellVal or GetTableCellRangeVals: If the range of cells has the same data type, you can use the second command which is faster; If the cells are different (for example digital and channels) you must solve each of them individually. The use of the Clipboard doesn't have this limitation.

  • I want to change the table with the expression of dangerousness of the virtual columns with her, need advice

    Hi all

    Here is the structure of the table with two expression of virtual columns associated highlighted, now I want to delete these expressions with virtual columns (but must keep my VIRTUAL columns as it is).

    Is it possible the alter or I need to raise the table, make a new structure and copy content back to newly structured table... Pleae help!

    CREATE TABLE TEST_COL)

    SAGE_TRADE_TYPE VARCHAR2 (50 BYTE),

    LOCAL_TZ VARCHAR2 (20 BYTE),

    ACE GMT_CONV_ENTERED_DT_TS (SAGEDBO. FN_CONVERT_TIMEZONE (LOCAL_TZ, ENTERED_DT_TS)) VIRTUAL,.

    ACE GMT_CONV_EXECUTION_DT_TS (SAGEDBO. FN_CONVERT_TIMEZONE (LOCAL_TZ, UPSTREAM_EXECUTION_TS)) VIRTUAL,.

    EOD_IND VARCHAR2 (10 BYTE)

    );

    Thank you very much

    Arpit

    Try this

    ALTER table test_col change gmt_conv_entered_dt_ts (0) virtual;

    ALTER table test_col change gmt_conv_execution_dt_ts (1) virtual;

  • How to create a table with these dimensions?

    Still new in Indesign, but I need to create a table like the one below.

    Screen Shot 2015-03-10 at 2.31.25 AM.png


    Select the text tool, I created a block of text and then insert a table. However, I'm lost as to how to change the top line for the length of the two columns from the bottom.
    I looked at the options of panel paintings, but it only allows me to change the number of lines and columns.

    All advice is appreciated. Thank you.

    You must create a table with two rows and two columns.

    To select the first line and click "merge cells".

  • How update the relational table with XML data?

    I get XML messages that include a bunch of data items to be updated in a table. An arbitrary subset of rows is updated for each message received.

    The output of the following example is correct, but the use of the intermediate table that bothers me. The temporary table can be eliminated somehow? Or is the most reasonable way to loop just explicitly and parse the XML message and then update each row separately?

    I'm under 11.2.0.1.0.
    create table otn9test (
      id number not null primary key,
      data xmltype
    );
    
    insert into otn9test values (1, xmltype('<data>default for 1</data>'));
    insert into otn9test values (2, xmltype('<data>default for 2</data>'));
    insert into otn9test values (3, xmltype('<data>default for 3</data>'));
    
    create table otn9input (
      id number,
      data xmltype
    );
    
    column data format a30
    
    declare
      updata constant xmltype := xmltype('<root>
      <item>
        <id>1</id>
        <data>Id 1 updated.</data>
      </item>
      <item>
        <id>3</id>
        <data>Id 3 updated.</data>
      </item>
      <item>
        <id>4</id>
        <data>Id 4 updated.</data>
      </item>
    </root>');
    
    begin
      insert into otn9input
        select * from
        xmltable('/root/item' passing updata
              columns
              id number path 'id',
              data xmltype path 'data');
    
      update otn9test t set data = (
        select data from otn9input i
        where t.id = i.id
      ) where t.id in (select id from otn9input);
    
      commit;
    end;
    /
    
    select * from otn9input;
    
    /*
         ID DATA
    ---------- ------------------------------
          1 <data>Id 1 updated.</data>
          3 <data>Id 3 updated.</data>
          4 <data>Id 4 updated.</data>
    */
    
    select * from otn9test;
    
    /*
         ID DATA
    ---------- ------------------------------
          1 <data>Id 1 updated.</data>
          2 <data>default for 2</data>
          3 <data>Id 3 updated.</data>
    */
    
    drop table otn9input;
    drop table otn9test;

    The temporary table can be eliminated somehow?

    You can do it with the MERGER:

    merge into otn9test t
    using (
      select id, data
      from xmltable('/root/item' passing updata
            columns
              id   number  path 'id',
              data xmltype path 'data'
           )
    ) x
    on ( t.id = x.id )
    when matched then update
     set t.data = x.data
    ;
    

    However, if you are looking for performance on large data sets, I think that the best is to use an intermediate table of XMLType (binary storage) to maintain the XML instance.

    create table otn9input of xmltype
    xmltype store as securefile binary xml;
    
    insert into otn9input values(
    xmltype('
      
        1
        Id 1 updated.
      
      
        3
        Id 3 updated.
      
      
        4
        Id 4 updated.
      
    ')
    );
    
    merge into otn9test t
    using (
    select id, data
    from otn9input,
         xmltable('/root/item' passing object_value
              columns
                id number path 'id',
                data xmltype path 'data'
         )
    ) x
    on ( t.id = x.id )
    when matched then update
     set t.data = x.data
    ;
    

    A structured XMLIndex could also help.

Maybe you are looking for