2013-06-13 10 views
5

Bardzo nowość w SQL Sever tutaj ... Rozumiem koncepcję łączenia tabel itp., Ale jaki jest najłatwiejszy sposób określenia, które kolumny są udostępniane?Jak określić, które kolumny są współużytkowane przez dwie tabele?

Powiedzmy, że mamy tabelę 1 i tabelę 2, zakładamy, że tabela 1 zawiera ponad 100 kolumn, podobnie jak w tabeli 2, ale mają one tylko jedną kolumnę wspólną.

Czy istnieje prosty sposób sprawdzenia, która kolumna/jeśli są udostępniane bez denerwującego wchodzenia i sprawdzania?

Bardzo banalne pytanie, ale bardzo przydatne. Dzięki

Odpowiedz

1

Może to również oznaczać zasadniczą kwestię projektowania ale znaleźć nazwy kolumn udostępnionych przez obu tabelach kilka opcji byłoby

SELECT name 
FROM sys.columns 
WHERE object_id IN (object_id('dbo.Table1'), 
        object_id('dbo.Table2')) 
GROUP BY name 
HAVING COUNT(*) = 2 

Albo

SELECT name 
FROM sys.columns 
WHERE object_id = object_id('dbo.Table1') 
INTERSECT 
SELECT name 
FROM sys.columns 
WHERE object_id = object_id('dbo.Table2') 
+0

miałem zamiar zaproponować własny dołączyć na INFORMATION_SCHEMA.COLUMNS (podobnych do Czad Henderson), ale jest to dość śliski. –

0

Oto zapytanie poręczny można użyj, aby wyświetlić kolumny w tabeli:

SELECT c.name ColumnName 
FROM sys.columns c INNER JOIN 
    sys.tables t ON c.object_id = t.object_id 
WHERE t.name = 'something' 

A tutaj jest DOŁĄCZ, którego można użyć do znalezienia wspólne nazwy kolumn:

SELECT * 
FROM (SELECT c.name ColumnName 
     FROM sys.columns c INNER JOIN 
      sys.tables t ON c.object_id = t.object_id 
     WHERE t.name = 'table1' 
    )t1 
JOIN (SELECT c.name ColumnName 
     FROM sys.columns c INNER JOIN 
      sys.tables t ON c.object_id = t.object_id 
     WHERE t.name = 'table2' 
    )t2 
ON t1.ColumnName = t2.ColumnName 
8

można znaleźć dane jak to w INFORMATION_SCHEMA tabelach. Technicznie są one bardziej znormalizowane niż widoki sys. (Patrz this question.)

Oto kwerendy można użyć:

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' 

Jeśli trzeba podać schemat, aby uniknąć kolizji nazw, dodać A.TABLE_SCHEMA = 'dbo' etc klauzuli where.

3

Użyj INFORMATION_SCHEMA.COLUMNS tak:

IF OBJECT_ID('Table1') IS NOT NULL DROP TABLE Table1 
IF OBJECT_ID('Table2') IS NOT NULL DROP TABLE Table2 
GO 
CREATE TABLE Table1 (
    a INT 
    , b INT 
    , c INT 
    , d INT 
    , e INT 
    , f INT 
) 

CREATE TABLE Table2 (
    c INT 
    , d INT 
    , e INT 
    , f INT 
    , g INT 
    , h INT 
    , i INT 
) 

GO 

SELECT t1.COLUMN_NAME 
FROM  INFORMATION_SCHEMA.COLUMNS AS t1 
INNER JOIN INFORMATION_SCHEMA.COLUMNS AS t2 ON t1.COLUMN_NAME = t2.COLUMN_NAME 
WHERE t1.TABLE_NAME = 'Table1' AND t2.TABLE_NAME = 'Table2' 

- WYJŚCIE

COLUMN_NAME 
c 
d 
e 
f 
0

Aby wiedzieć, czy masz podobne kolumny potencjalnie może być trudniejsze niż inne rozwiązania sugerują. Możemy myśleć, że dwie kolumny są takie same, ponieważ mają takie same nazwy, ale w rzeczywistości, gdy pracujesz w dużej bazie danych z więcej niż jedną osobą, tworzenie, usuwanie i/lub zmiana struktury danych może się zdarzyć niespójności.

Im więcej parametrów sprawdzimy pod kątem podobieństwa, tym bardziej możemy być pewni, że nasze kolumny są podobne bez ręcznej kontroli surowych danych.

1. Po pierwsze, proponuję uruchomić zapytanie, aby zrozumieć parametry danej kolumny.

SELECT 
    * 
FROM 
    DATABASENAME.INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = N'TABLE1' 

Spowoduje to zwrócenie kilku kolumn danych meta w kolumnach w tabeli. Niektóre z meta danych, które uznałem za interesujące dla unikalności, zawierały ...

enter image description here

2. W moim przypadku mam zidentyfikować atrybuty kolumn z COLUMN_NAME, IS_NULLABLE, AND DATA_TYPE w celu ustalenia, czy moje kolumny naprawdę mecz.

SELECT 
    DISTINCT A.COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS A 
    LEFT join INFORMATION_SCHEMA.COLUMNS B 
     ON A.COLUMN_NAME = B.COLUMN_NAME 
     AND A.DATA_TYPE = B.DATA_TYPE 
     AND A.IS_NULLABLE = B.IS_NULLABLE 
WHERE 
    A.TABLE_NAME = N'TABLE1' 
    AND B.TABLE_NAME = N'TABLE2' 

3. Concept Sprawdź ... Może gdyby kiedy JOIN używając tylko COLUMN_NAME istnieje 10 pasujących kolumn. Może gdy JOIN przy użyciu COLUMN_NAME AND DATA_TYPE istnieje 7 pasujących kolumn. Może kiedy użyjemy wszystkich trzech warunków, jak w powyższym przykładzie, są 4 dopasowane kolumny. Czy to oznacza, że ​​możesz JĄ DOŁĄCZYĆ na 4 pasujących kolumnach ... absolutnie nie. Co to znaczy, musisz zastanowić się, jak zaprojektować obsługę błędów i rzutowanie w zależności od tego, jak zamierzasz DOŁĄCZYĆ do stołów. Point being jest ostrożnym wykonaniem JOIN na INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, ponieważ twoje wyniki mogą być dalekie od zamierzonych.

0

Użyj następującego zapytania (nazwa używana, aby pokazać listę kolumn coman)

select name from syscolumns s1 where id = object_id('table1') and   exists(select 1 from syscolumns s2 where s2.name = s1.name and s2.id = object_id('table2')) 
2
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table1' 

intersect 

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'Table2' 
+0

Witamy w Stack Overflow! Chociaż ten fragment kodu jest mile widziany i może zapewnić pomoc, byłoby [znacznie ulepszone, gdyby zawierał wyjaśnienie] (// meta.stackexchange.com/q/114762) * how * and * why * to rozwiązuje problem . Pamiętaj, że odpowiadasz na pytanie dla czytelników w przyszłości, a nie tylko pytasz teraz! Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienie i podać, jakie ograniczenia i założenia mają zastosowanie. –

Powiązane problemy