2013-06-13 8 views
5

Rất mới đối với SQL Sever ở đây ... Tôi hiểu khái niệm về việc tham gia các bảng, v.v. nhưng cách dễ nhất để xác định cột nào được chia sẻ?Cách xác định cột nào được chia sẻ giữa hai bảng?

Ví dụ: chúng tôi có Bảng 1 và Bảng 2, giả sử bảng 1 có hơn 100 cột như bảng 2, nhưng chúng chỉ có 1 cột chung.

Có cách nào đơn giản để kiểm tra xem cột nào/nếu có được chia sẻ mà không gây khó chịu khi truy cập và kiểm tra không?

Câu hỏi khá tầm thường nhưng rất hữu ích. Cảm ơn

Trả lời

1

này cũng có thể chỉ ra một vấn đề thiết kế cơ bản nhưng để tìm tên cột được chia sẻ bởi cả hai bảng một vài tùy chọn sẽ là

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

Hoặc

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

tôi sẽ đề nghị một tự tham gia vào bảng information_schema (tương tự như Chad Henderson), nhưng điều này là khá trơn. –

0

Đây là một truy vấn có ích bạn có thể sử dụng để liệt kê các cột trong một bảng:

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

Và đây là một JOIN bạn có thể sử dụng để tìm tên cột phổ biến:

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

Bạn có thể tìm thấy dữ liệu như thế này trong các bảng INFORMATION_SCHEMA. Về mặt kỹ thuật, những tiêu chuẩn này được chuẩn hóa nhiều hơn chế độ xem sys. (Xem this question.)

Dưới đây là một câu hỏi, bạn có thể sử dụng:

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' 

Nếu bạn cần phải xác định schema để tránh xung đột tên, thêm A.TABLE_SCHEMA = 'dbo' vv để mệnh đề where.

3

Sử dụng các bảng information_schema như thế này:

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' 

- OUTPUT

COLUMN_NAME 
c 
d 
e 
f 
0

Để biết nếu bạn có các cột tương tự có khả năng có thể là phức tạp hơn so với các giải pháp khác đề nghị. Chúng tôi có thể nghĩ rằng hai cột giống nhau vì chúng có chung tên nhưng trong thực tế khi bạn làm việc trong một cơ sở dữ liệu lớn với nhiều người tạo, xóa và/hoặc thay đổi cấu trúc dữ liệu không nhất quán có thể xảy ra.

Càng nhiều thông số chúng tôi kiểm tra tính tương tự, chúng tôi càng tự tin rằng các cột của chúng tôi tương tự nhau mà không cần kiểm tra thủ công dữ liệu thô.

1. Trước tiên, tôi đề nghị bạn chạy truy vấn để hiểu các tham số của một cột nhất định.

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

Điều này sẽ trả về một số cột dữ liệu meta trên các cột trong bảng. Một số dữ liệu meta tôi thấy thú vị cho tính duy nhất bao gồm ...

enter image description here

2. Trong trường hợp của tôi, tôi đã xác định các thuộc tính của cột COLUMN_NAME, IS_NULLABLE, AND DATA_TYPE để xác định xem cột của tôi thực sự phù hợp.

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. Khái niệm Kiểm tra ... Có lẽ nếu khi chúng ta chỉ sử dụng JOINCOLUMN_NAME có 10 cột phù hợp. Có thể khi chúng tôi JOIN sử dụng COLUMN_NAME AND DATA_TYPE có 7 cột phù hợp. Có lẽ khi chúng ta sử dụng cả ba điều kiện như trong ví dụ trên có 4 cột phù hợp. Có nghĩa là bạn chỉ có thể THAM GIA trên 4 cột phù hợp ... hoàn toàn không. Điều đó có nghĩa là bạn sẽ cần phải xem xét làm thế nào để xử lý lỗi và đúc lỗi tùy thuộc vào cách bạn dự định JOIN các bảng. Điểm đang được thực hiện cẩn thận JOIN trên INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME vì kết quả của bạn có thể không được dự định.

0

Sử dụng sau đây truy vấn (tên sử dụng để hiển thị danh sách các cột 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

Chào mừng bạn đến với Stack Overflow! Trong khi đoạn mã này được chào đón, và có thể cung cấp một số trợ giúp, nó sẽ được [cải thiện rất nhiều nếu nó bao gồm một lời giải thích] (// meta.stackexchange.com/q/114762) của * how * và * why * this giải quyết vấn đề . Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ là người hỏi ngay bây giờ! Vui lòng [sửa] câu trả lời của bạn để thêm giải thích và đưa ra chỉ dẫn về những giới hạn và giả định được áp dụng. –