2012-04-04 29 views
12

Tôi hy vọng đây không phải là lặp lại. Tôi đã kiểm tra các tìm kiếm và dường như tôi không thể tìm thấy câu trả lời rõ ràng cho điều này.Tham gia các bảng SQL Server trên một tuyên bố tương tự

Tôi có một bảng có khóa chính được đặt là UniqueIdentifier. Tôi cũng có một bảng khác có một cột varchar về cơ bản chứa một url với một chuỗi truy vấn có chứa các hướng dẫn từ bảng đầu tiên của tôi.

Vì vậy, 2 bàn của tôi cũng giống như:

StateTable

StateID         StateName 
EB06F84C-15B9-4397-98AD-4A63DA2A238E  Active 

URLTable

URL 
page.aspx?id=EB06F84C-15B9-4397-98AD-4A63DA2A238E 

Những gì tôi đang cố gắng làm là tham gia cùng nhau URLTableStateTable ON giá trị của StateID được chứa trong URL của bảng URL. Tôi đã không thực sự tìm ra sự tham gia. Tôi thậm chí đã thử chỉ chọn một bảng và cố gắng lọc theo các giá trị trong StateTable. Tôi đã cố gắng làm một cái gì đó như thế này:

SELECT * 
FROM URLTable 
WHERE  EXISTS 
    (SELECT * 
    FROM StateTable 
    WHERE URL LIKE '%' + StateID + '%') 

Thậm chí điều đó không làm việc vì nó nói tôi so sánh uniqueidentifiervarchar.

Có cách nào để tham gia 2 bảng bằng lệnh giống như vậy và nơi lệnh tương tự không so sánh 2 biến không tương thích?

Cảm ơn bạn !!

CẬP NHẬT: Hãy để tôi thêm một số điều bổ sung mà tôi đã đề cập. Truy vấn này nhằm mục đích xây dựng các báo cáo phân tích. Các bảng là một phần của gói phân tích CMS ... do đó việc cập nhật hoặc thay đổi cấu trúc bảng không phải là một tùy chọn.

Thứ hai, các bảng này có lượng lưu lượng truy cập rất cao vì chúng đang thu thập phân tích trang web ... do đó hiệu suất là một vấn đề rất lớn. Điều thứ ba là trong ví dụ của tôi, tôi đã nói id = nhưng có thể có nhiều giá trị như id=guid&user=guid&date=date.

CẬP NHẬT 2: Một điều nữa tôi nhận ra là kinh dị là đôi khi chuỗi truy vấn có dấu gạch ngang bị xóa khỏi GUID .. và đôi khi không .. vì vậy trừ khi tôi nhầm, tôi không thể truyền chuỗi con để Uniqueidentifier. ai có thể xác nhận? phào nhẹ. tôi đã nhận được nó để làm việc bằng

REPLACE('-','',CONVERT(varchar(50), a.AutomationStateId)) 

nhưng bây giờ tôi rất nhiều lo lắng về vấn đề hiệu suất với điều này kể từ khi bảng của URL là rất lớn. Điều này có thể là bản chất của con thú, mặc dù, trừ khi có bất cứ điều gì tôi có thể làm.

Trả lời

17

Cast StateID thành comp loại có thể đọc được, ví dụ:

WHERE URL LIKE '%' + CONVERT(varchar(50), StateID) + '%' 

hoặc

WHERE URL LIKE N'%' + CONVERT(nvarchar(50), StateID) + N'%' 

nếu URL là nvarchar (...)

EDIT

Như đã chỉ ra trong câu trả lời khác, điều này có thể dẫn đến hiệu suất kém trên bảng lớn. LIKE được kết hợp với CONVERT sẽ dẫn đến quét bảng. Điều này có thể không phải là một vấn đề đối với các bảng nhỏ, nhưng bạn nên xem xét tách URL thành hai cột nếu hiệu suất trở thành một vấn đề. Một cột sẽ chứa 'page.aspx? Id =' và cột kia là UNIQUEIDENTIFIER. Truy vấn của bạn sau đó có thể được tối ưu hóa dễ dàng hơn nhiều.

5

Bạn có biết rằng = luôn ở đó và luôn là UNIQUEIDENTIFIER. Sau đó, bạn có thể làm điều này:

WHERE CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID 

EDIT

Là một phần của bình luận bạn cũng có thể vì thế nó với một JOIN. Như thế này:

select 
    u.* 
from 
    urltable 
join statetable s 
    on CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID 
+0

+1 và tôi nghĩ bạn có thể sử dụng cú pháp đó trong một tham gia – Paparazzi

+0

Cập nhật câu trả lời – Arion

+0

Điều đó có hiệu quả không nếu tôi sử dụng Tôi đang tìm kiếm sẽ luôn luôn theo chuỗi "ID =" và nó sẽ luôn luôn là 36 ký tự sau đây? Có thể một cái gì đó như CAST (SUBSTRING (URL, CHARINDEX ('ID =', URL) +1,36) AS UNIQUEIDENTIFIER) = StateID và hiệu năng như thế nào? – divamatrix

4
select u.* from urltable 
join statetable s on url like N'%' + (convert(varchar(50),s.stateid) + N'%' 

hiệu suất có khả năng là khủng khiếp

+0

Cảm ơn đề xuất trên bảng phụ. Thực ra, tôi nghĩ đó là một ý tưởng tuyệt vời và chắc chắn sẽ hoạt động mà không can thiệp vào cấu trúc hiện tại. Bây giờ .. Tôi sẽ thành thật và nói rằng tôi không phải là một DBA. Bất kỳ lời khuyên nào về cách tốt nhất để xây dựng và duy trì bảng đó? Biết rằng cơ sở dữ liệu nhìn thấy rất nhiều lưu lượng truy cập thường được lưu trữ trên máy chủ DB của chính nó, tôi có thể xem xét thêm một bảng vào db của trang web thay vì db phân tích. – divamatrix

+0

Tốt hơn nếu bảng mới nằm trong cùng một db hoặc ít nhất cùng một máy chủ, hãy làm việc nhiều hơn một chút nếu không. Câu hỏi lớn cho bảng là lược đồ là bạn có thể nhận được nhiều hơn một bản ghi url cho cùng một guid. –

+0

Trên thực tế, một ít điều tra hơn cho tôi biết rằng tôi chắc chắn sẽ muốn có bảng trong cùng một db. Vì vậy, đó là giả định. Để trả lời câu hỏi khác của bạn, tuyệt đối.bảng trạng thái, chẳng hạn, là một bảng chứa các id cho các kiểu khách truy cập cụ thể. Bảng URL là một bảng phức tạp về cơ bản nhìn vào url và id phiên cho mỗi yêu cầu và trừ khi nó tìm thấy bản ghi khớp với cả phiên và url chính xác, nó sẽ tạo bản ghi mới. Tôi đang tìm kiếm các url cơ sở duy nhất được truy cập cho từng id người dùng bằng cách xem các truy vấn url trường chứa id của chúng – divamatrix

0

Bạn có thể nhận được một sự cải thiện hiệu suất nếu bạn xây dựng một bảng tạm thời đầu tiên, với các tùy chọn để chỉ mục bảng temp. Sau đó bạn có thể sửa đổi lược đồ (trong bảng tạm thời của bạn) có thể cung cấp cho bạn các tùy chọn về phép nối của bạn. Thông thường, khi tham gia vào các bảng BIG, nó sẽ giúp trích xuất một tập con dữ liệu vào một bảng tạm thời trước, sau đó tham gia vào nó. Lần khác trên đầu bảng tạm thời lớn hơn việc sử dụng 'xấu xí' tham gia

Các vấn đề liên quan