I'm banging my head against the wall with this one. Why does the query editor in SSMS give me an error about the closing parenthesis at the end of this query?
SELECT
c.TABLE_NAME,
c.COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS c
INNER JOIN
(SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY COLUMN_NAME
HAVING COUNT(*) = 1)
I get this error:
Incorrect syntax near ')'
You're missing an alias for the subquery in parenthesis and an on clause:
SELECT
c.TABLE_NAME,
c.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN
(SELECT
COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY COLUMN_NAME
HAVING COUNT(*) = 1
) x -- Alias added here
ON x.COLUMN_NAME = c.COLUMN_NAME -- ON caluse
You don't need to use join here, you can use exists :
select c.*
from information_schema.columns c
where not exists (select 1
from information_schema.columns c1
where (c1.column_name = c.column_name) and
(c1.table_name <> c.table_name or c1.table_schema <> c.table_schema)
);
Related
There are 2 tables which have 10 columns common in both the tables and 2 columns exist in table 2 but not in table 1. I have a task where I need to get those 2 columns present in Table 2 but not in Table 1.
The condition for the query is:
We must use information_schema.columns table.
Left join must be used on the same table information_schema.columns
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS t2
LEFT JOIN INFORMATION_SCHEMA.COLUMNS t1
ON t2.COLUMN_NAME = t1.COLUMN_NAME
AND t1.TABLE_NAME = 'table1'
WHERE t2.TABLE_NAME = 'table2'
AND t1.COLUMN_NAME IS NULL;
As per your requirement there care multiple solutions to this problem. Just giving a simple one:
Left join the information_schema.columns table with itself on the table_name and column_names and then filter out the columns of 'table1' using where not exists from the joined result. Finally apply another filter on the joined result to take only the column_name which are in 'table2':
select isc1.column_name from information_schema.columns isc1
left join information_schema.columns isc2
on isc1.table_name = isc2.table_name and isc1.column_name = isc2.column_name
where not exists (select column_name
from information_schema.columns isc
where isc.table_name = 'table1')
and isc1.table_name = 'table2';
A simple way is to take all the columns of Table 2 that are not in Table 1.
SELECT c.COLUMN_NAME
FROM information_schema.tables t
join INFORMATION_SCHEMA.COLUMNS c on t.TABLE_NAME = c.TABLE_NAME
WHERE t.TABLE_NAME = 'table2' and c.COLUMN_NAME not in
(
SELECT c.COLUMN_NAME
FROM information_schema.tables t
join INFORMATION_SCHEMA.COLUMNS c on t.TABLE_NAME = c.TABLE_NAME
WHERE t.TABLE_NAME = 'table1'
)
Need to also select the row/record count using the following query in Oracle SQL. How would I go about doing this?
SELECT DISTINCT t.OWNER AS TABLE_SCHEMA, t.Table_Name, c.COLUMN_NAME, c.DATA_TYPE,
(
SELECT CASE WHEN cons.CONSTRAINT_TYPE = 'P' THEN 'Primary Key' ELSE NULL END
FROM SYS.all_cons_columns cols
INNER JOIN SYS.all_constraints cons ON cons.constraint_name=cols.constraint_name AND cons.constraint_type = 'P'
WHERE cols.Column_name=c.column_name AND cols.TABLE_NAME=c.TABLE_NAME AND cols.OWNER=c.OWNER
) AS CONSTRAINT_TYPE, c.DATA_PRECISION, c.DATA_SCALE
FROM SYS.ALL_TABLES t
INNER JOIN SYS.all_tab_columns c ON c.TABLE_NAME=t.TABLE_NAME AND c.OWNER=t.OWNER
WHERE t.OWNER = 'MY_SCHEMA_NAME' AND t.Table_Name = 'MY_TABLE_NAME'
If you can live with an estimate number of rows (whose accuracy depends on the freshness of each table's statistics), you can just use column NUM_ROWS from ALL_TABLES:
SELECT
t.OWNER AS TABLE_SCHEMA,
t.Table_Name,
c.COLUMN_NAME,
c.DATA_TYPE,
t.NUM_ROWS, --> here
...
FROM all_tables t
INNER JOIN all_tab_columns c ...
Note that DISTINCT seem superfluous here - your query generates one record per column in the table.
If you really need the exact count, then you can use an inline query - but you need to hardcode the table name:
SELECT
t.OWNER AS TABLE_SCHEMA,
t.Table_Name,
c.COLUMN_NAME,
c.DATA_TYPE,
(SELECT COUNT(*) FROM my_schema_name.my_table_name) no_rows,
...
FROM all_tables t
INNER JOIN all_tab_columns c ...
WHERE t.OWNER = 'MY_SCHEMA_NAME' AND t.Table_Name = 'MY_TABLE_NAME'
Not sure which SQL you are using but you might put the whole result into a temp table
like
INTO temp temp_table_count WITH NO LOG;
SELECT COUNT(*) FROM temp_table_count;
https://www.oracletutorial.com/oracle-basics/oracle-private-temporary-table/ the reference
INSERT INTO ora$ppt_temp_table_count(ADD ALL COLUMNS HERE
COMMASEPARATED)
SELECT col1, col2, col3
FROM source_table
WHERE condition; <-- your query
SELECT COUNT(*) FROM ora$ppt_temp_table_count;
Need to also select the total record count given the following query. How would I go about doing this?
SELECT DISTINCT t.Creator AS TABLE_SCHEMA, t.Name AS Table_Name, c.Name AS COLUMN_NAME,
c.COLTYPE AS DATA_TYPE, CASE WHEN c.KEYSEQ = 1 THEN 'Primary Key' ELSE NULL END AS CONSTRAINT_TYPE, NULL AS DATA_PRECISION, NULL AS DATA_SCALE
FROM SYSIBM.SYSTABLES t
INNER JOIN SYSIBM.SYSCOLUMNS c ON c.TBNAME = t.Name
WHERE t.Creator='MY_SCHEMA_NAME' AND t.Name='MY_TABLE_NAME'
Any help would be appreciated, thanks
For any SELECT statement including your one:
SELECT T.*, COUNT(1) OVER() AS ROW_COUNT
FROM
(
SELECT DISTINCT t.Creator AS TABLE_SCHEMA, t.Name AS Table_Name, c.Name AS COLUMN_NAME,
c.COLTYPE AS DATA_TYPE, CASE WHEN c.KEYSEQ = 1 THEN 'Primary Key' ELSE NULL END AS CONSTRAINT_TYPE, NULL AS DATA_PRECISION, NULL AS DATA_SCALE
FROM SYSIBM.SYSTABLES t
INNER JOIN SYSIBM.SYSCOLUMNS c ON c.TBNAME = t.Name
WHERE t.Creator='MY_SCHEMA_NAME' AND t.Name='MY_TABLE_NAME'
) T;
Need to also select the total record count given the following query.
The SELECT DISTINCT seems superfluous. The system tables should not have duplicates. If you are getting duplicates, it is probably because the JOIN conditions are not complete -- you should join on both the table name and creator.
So just use COUNT(*)
SELECT COUNT(*)
FROM SYSIBM.SYSTABLES t INNER JOIN
SYSIBM.SYSCOLUMNS c
ON c.TBNAME = t.Name AND
c.TBCREATOR = t.TBCREATOR
WHERE t.Creator = 'MY_SCHEMA_NAME' AND
t.Name = 'MY_TABLE_NAME';
For example, if I need to join TableA & TableB - how can I use the INFORMATION_SCHEMA database to find the common field between them?
Here is one method:
select column_name
from information_schema.columns c
where table_name in ('A', 'B')
group by column_name
having count(*) = 2;
If necessary, you should also include table_schema to identify the tables.
Another way to get common fields in two table:
SELECT C.name
FROM SYS.OBJECTS O
JOIN SYS.COLUMNS C
ON O.object_id = C.object_id
WHERE O.name IN
(
'TABLE-A', 'TABLE-B'
)
group by C.name
having count(*) = 2;
Way to get common column in two table:
SELECT A.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS A
JOIN INFORMATION_SCHEMA.COLUMNS B ON A.COLUMN_NAME = B.COLUMN_NAME
WHERE A.TABLE_NAME 'Table_1'
AND B.TABLE_NAME = 'Table_2'
I am creating a query that returns the number of columns in each table, but I want to exclude Views.
The following works but returns View results:
SELECT COUNT(*), table_name
FROM INFORMATION_SCHEMA.COLUMNS
Group By table_name
Any suggestions?
NOTE: MSSQL 2005+
This assumes SQL 2005 or higher
SELECT
t.name,
count(c.name)
FROM
sys.tables t
inner join sys.columns c
ON t.object_id = c.object_id
group by t.name
Something like this:
SELECT COUNT(col.column_name), col.table_name
FROM information_schema.columns col
JOIN information_schema.tables tbl
ON tbl.table_name = col.table_name
AND tbl.table_schema = col.table_schema
AND tbl.table_catalog = col.table_catalog
AND tbl.table_type <> 'VIEW'
GROUP BY col.table_name
Join INFORMATION_SCHEMA.TABLES to find out if the table is a view.
SELECT COUNT(col.column_name), tab.table_name
FROM INFORMATION_SCHEMA.tables tab
JOIN INFORMATION_SCHEMA.COLUMNS col ON col.table_name = tab.table_name
WHERE tab.table_type != 'VIEW'
GROUP BY 2
ORDER BY 2
SELECT tab.table_name,COUNT(col.column_name)
FROM INFORMATION_SCHEMA.tables tab
JOIN INFORMATION_SCHEMA.COLUMNS col ON col.table_name = tab.table_name
WHERE tab.table_type != 'VIEW'
GROUP BY tab.table_name
ORDER BY tab.table_name
This code shows the table names and their columns count in front of them.
you can add the schema name if you want.