2009-12-03 27 views
6

Tôi có 10 bảng mà tôi đang tham gia cùng nhau để tạo chế độ xem. Tôi chỉ chọn ID từ mỗi bảng, nhưng trong chế độ xem, mỗi ID có thể hiển thị nhiều lần, tuy nhiên, kết hợp tất cả các ID sẽ luôn là duy nhất. Có cách nào để tạo cột khác trong chế độ xem này sẽ là một ID duy nhất không?Có thể tạo một ID duy nhất trong Chế độ xem SQL Server sẽ vẫn giống nhau mỗi lần chế độ xem được gọi không?

Tôi muốn lưu trữ ID duy nhất và sử dụng ID đó để truy vấn đối với chế độ xem để nhận tất cả các ID khác.

Trả lời

1

Không, bạn không thể làm điều đó trong chế độ xem, những gì bạn có thể làm là tạo một bảng tạm thời để giữ tất cả thông tin này và tạo khóa hoặc id duy nhất cho mỗi hàng.

+1

+ 1'ed. Nhưng, nếu anh ta muốn thông tin đó tồn tại, nó sẽ không phải là một bảng tạm thời, nó sẽ là một bảng thực sự. –

+0

@Mark yep bạn đúng :). – JonH

1

Tôi nghĩ bạn có thể làm điều đó bằng ROW_NUMBER(), ít nhất là nếu bạn có thể đảm bảo thứ tự của chế độ xem. Ví dụ:

SELECT 
    ROW_NUMBER() OVER (ORDER BY col1, col2, col3) as UniqueId 
FROM <lotsa joins> 

Miễn là thứ tự vẫn giữ nguyên và chỉ các trường được thêm vào cuối, id sẽ là duy nhất.

+0

Điều này sẽ không đảm bảo rằng các con số giống nhau mỗi lần. Nếu tôi có (1, 1, 1) và (3, 3, 3), chúng sẽ là 1 và 2 tương ứng. Nếu sau đó tôi thêm (2, 2, 2) thì hàng (3, 3, 3) bây giờ sẽ trở thành 3 và không 2. –

+0

@Tom H: Đó là lý do tại sao tôi đặt "nếu bạn có thể đảm bảo đặt hàng" ở đầu Câu trả lời của tôi :) – Andomar

+0

Đảm bảo một đơn đặt hàng không làm điều đó mặc dù. Nó không chỉ là thứ tự của các hàng mà còn không có hàng mới nào có thể được thêm vào và không thể thay đổi các hàng. Nói cách khác, dữ liệu sẽ phải hoàn toàn tĩnh với ngoại lệ thêm hàng vào cuối cùng trong thứ tự. –

0

Thực tế là bạn đang cố gắng làm điều này trỏ đến nhiều vấn đề lớn hơn trong thiết kế cơ sở dữ liệu và/hoặc kiến ​​trúc ứng dụng.

Vì bạn có 10 bảng và tôi sẽ đoán rằng DB designer (s) chỉ tát vào ID INT IDENTITY cho tất cả các bảng bạn sẽ có khoảng (2^31)^10 hàng có thể cai ban.

Loại dữ liệu duy nhất mà tôi có thể nghĩ đến có thể bao gồm số đó sẽ dịch tất cả các số nguyên thành các chuỗi 0 đệm và đặt tất cả chúng lại với nhau thành một CHAR lớn.

Tôi đoán là vấn đề thực sự của bạn không nhận được ID này cho chế độ xem nhưng một số điều khác mà bạn đang cố gắng làm, đó là câu hỏi mà bạn nên hỏi. Chỉ cần một linh cảm mặc dù.

+0

Vâng, tôi hoàn toàn đồng ý, tiếc là một cái gì đó mà tôi đang gặp khó khăn khi làm việc với, chỉ cần tìm cách tốt nhất để đi về nó. Đó là một cơ sở dữ liệu phương tiện, do đó, có hơn 50 bảng mỗi bảng chứa ID của riêng mình mà tất cả đều có thể được kết hợp với phần tiếp theo. Tôi chỉ cố gắng tổng hợp các thông tin/ID cơ bản để chạy các truy vấn khác từ: VehicleID, BedID, BodyStyleID, BrakeID, DriveTypeID, EngineConfigID, v.v ... thực sự không đẹp. – Brendo

0

Một khả năng sẽ là gọi hàm từ chế độ xem của bạn để tính toán mã băm trên tất cả các cột ID. Nếu bạn sử dụng một thuật toán băm mật mã khá, tỷ lệ cược của một vụ va chạm là rất nhỏ (có thể nhiều khả năng đĩa sẽ phân phối dữ liệu xấu). Thậm chí dễ dàng hơn, bạn có thể tất nhiên chỉ cần ghép các ID khác nhau thành một ID lớn hơn nhiều, có lẽ là một cột nhị phân hoặc varbinary.

Việc lưu trữ ID đó và có thể truy vấn ID đó sẽ hoạt động nhiều hơn một chút. Tôi không thể nghĩ ra một cách để tính toán nó và lưu trữ nó từ một cái nhìn. Bạn có lẽ sẽ cần một thủ tục lưu trữ để tạo ra nó đầu tiên; chi tiết phụ thuộc rất nhiều vào chi tiết cụ thể của ứng dụng của bạn.

4

Tôi gặp vấn đề tương tự khi cần thiết để thiết lập phân cấp trên nhiều bảng. Nếu bạn đang sử dụng một số nguyên làm id trong mỗi bảng, bạn có thể chỉ cần chuyển đổi id của mỗi bảng thành một varchar và tiền tố chúng với một chữ cái khác nhau cho mỗi bảng. Ví dụ

CREATE VIEW LocationHierarchy as

SELECT 'C' + CONVERT(VARCHAR,[Id]) as Id 
     ,[Name] 
     ,'S' + CONVERT(VARCHAR,[State]) as parent 
    FROM [City] 
    UNION 
    SELECT 'S' + CONVERT(VARCHAR,[Id]) as Id 
     ,[Name] 
     ,'C' + CONVERT(VARCHAR,[Suburb]) as parent 
    FROM [Suburb] 

vv

Hiệu quả của giải pháp này sẽ phụ thuộc vào độ lớn dữ liệu của bạn.

+6

@tamago Nó vẫn hữu ích cho những người dùng như tôi đang nghiên cứu một chủ đề tương tự và đang tìm kiếm câu trả lời. –

1

Có, gần đây tôi đã có yêu cầu tương tự.

Khi tạo chế độ xem, hãy giữ câu chọn chọn là TEMP_TABLE và sau đó sử dụng chức năng Row_number() trên TEMP_TABLE này.

Dưới đây là một ví dụ:

CREATE VIEW VIEW_NM 
AS 
SELECT Row_number() OVER(ORDER BY column_nm DESC) AS 'RowNumber' FROM 
(SELECT COL1,COL2 FROM TABLE1 
UNION 
SELECT COL1,COL2 FROM TABLE2 
) AS TEMP_TABLE; 
Các vấn đề liên quan