SQL находит один и тот же столбец в разных таблицах - PullRequest
0 голосов
/ 22 июня 2011

У меня 2 очень больших стола. Я пытаюсь выяснить, что у них общего.

Они не имеют одинаковое количество столбцов. Я мог бы просто посмотреть на каждое имя столбца в каждой таблице и сравнить - но у них обоих есть сотни столбцов (я должен сделать это для многих таких таблиц).

Я использую MS Sql server.

Нет ограничений и предопределенных ключей ни на одном из них.

Как мне это сделать?

Примерно так:

select * AS "RES" from Table1 where RES IN (select * column from Table2)

Заранее спасибо.

Ответы [ 5 ]

8 голосов
/ 22 июня 2011

Если вы ищете одинаковые имена столбцов в двух таблицах, это должно сработать:

select name from syscolumns sc1 where id = object_id('table1') and exists(select 1 from syscolumns sc2 where sc2.name = sc1.name and sc2.id = object_id('table2'))

Вы также можете убедиться, что они одного типа, добавив и sc1.xtype= sc2.xtype в подзапросе.

1 голос
/ 22 июня 2011

Если я правильно понял, вы пытаетесь сравнить данные в двух таблицах и проверить, что общего у этих данных.

При условии, что у вас есть столбцы, которые вы хотите использовать для сравнения (Table1.YourColumnи Table2.OtherColumn, в примере), вы можете сделать это:

select YourColumn from Table1 t1
where exists (select OtherColumn 
              from Table2 t2 
              where t2.OtherColumn = t1.YourColumn)
0 голосов
/ 18 августа 2017
    DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),    @Table1 AS NVARCHAR(MAX)='Table1'    , @Table2 AS NVARCHAR(MAX)='Table2'

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(A.COLUMN_NAME) 
                    from INFORMATION_SCHEMA.COLUMNS A
                        join INFORMATION_SCHEMA.COLUMNS B
                          on A.COLUMN_NAME = B.COLUMN_NAME
                        where A.TABLE_NAME = @Table1
                          and B.TABLE_NAME = @Table2  and A.COLUMN_NAME not in ('Doc','CreatedBy')
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' 
            from 
            (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 = '''+@Table1+'''
              and B.TABLE_NAME = '''+@Table2+''' 

            ) x
            pivot 
            (
                Max(COLUMN_NAME)
                for COLUMN_NAME in (' + @cols + ')
            ) p '

execute sp_executesql @query
0 голосов
/ 23 июня 2011

Если ваша СУБД поддерживает дайджесты, вы можете рассчитать дайджест каждой строки и присоединиться к дайджесту. Что-то вроде:

SELECT T1.*
FROM
    (SELECT *, MD5(col1, col2,...) as digest
     FROM Table1) T1,
    (SELECT *, MD5(col1, col2,...) as digest
     FROM Table2) T2
WHERE T1.digest = T2.digest

Я предполагаю, что две таблицы имеют одинаковые столбцы и типы столбцов.

0 голосов
/ 22 июня 2011

Вот SP для поиска общих столбцов в двух разных таблицах ..

Работает в SQL Server

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetColumnsData(@T_NAME1 varchar,@T_NAME2 varchar)
AS
BEGIN
DECLARE @Co int;
SET @co = 0;
CREATE TABLE #TEMP_TABLE(C_NAME VARCHAR(50),D_TYPE VARCHAR(50),T_NAME VARCHAR(50));
INSERT INTO #TEMP_TABLE (C_NAME,D_TYPE,T_NAME)( SELECT COLUMN_NAME,DATA_TYPE,
TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @T_NAME1 OR
 TABLE_NAME= @T_NAME2);
SELECT @Co = COUNT(*) from #TEMP_TABLE t , #TEMP_TABLE t1 WHERE t1.C_NAME = t.C_NAME
 and t.D_TYPE = t1.D_TYPE and t.T_NAME != t1.T_NAME
PRINT @co
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...