2013-05-07 24 views
5

TABLE_A chứa một cột NVARCHAR(200) NOT NULLName. lĩnh vực của nó được tạo thành từ tên công ty tiếp theo là một dấu gạch dưới và kết thúc bằng một id công ty, ví dụ .:tham gia hai bảng trên đối số1 kết thúc bằng đối số2

MYCOMPANY_102

PK table_b là một cột INT NOT NULL gọi CompanyID và sẽ chứa ví dụ 102

Truy vấn của tôi, để tham gia bên trong hai bảng này, trong đó một đối số kết thúc bằng một bảng khác, không mang lại kết quả nào. Trong trường hợp bất cứ ai thắc mắc rõ ràng: có, có các hồ sơ phù hợp.

SELECT * FROM [SERVER1].[DB1].[dbo].[TABLE_A] a 
INNER JOIN [SERVER2].[DB2].[dbo].[TABLE_B] b 
ON a.Name LIKE '%[_]' + CONVERT(NVARCHAR, b.CompanyID) 

Mọi chỉnh sửa và hiểu rõ tại sao truy vấn của tôi không thể hoạt động, được hoan nghênh nhất.

EDIT: tên công ty có thể chứa chữ số và/hoặc gạch dưới ở bất cứ đâu, tôi CHỈ tìm cách khóa vào lần xuất hiện cuối cùng của dấu gạch dưới, theo sau là một int tự nhiên tùy ý. Có thể là _1, có thể là _205952 cho tất cả những gì tôi biết. Có NO số không hàng đầu trong hậu tố chữ số

+0

Tại sao không 'LIKE'% _ '+ CONVERT (NVARCHAR, b.CompanyID) '? Tôi không hiểu việc sử dụng '[]' (mặc dù tôi chưa bao giờ thực hiện một lần tham gia :)) – webnoob

+0

dấu gạch dưới là chữ, không phải là ký tự đại diện –

+0

không có dấu ngoặc vuông, dấu gạch dưới là ký tự đại diện một char, ký hiệu phần trăm là ký tự đại diện đa char. Điều đó sẽ không hiệu quả. Tôi đã thực hiện gạch dưới bản thân mình để cho phép các tên công ty có thể, và của chính họ, kết thúc bằng chữ số. –

Trả lời

2

gì bạn phải làm là lấy ID mà ra từ tên và tham gia vào nó như ở đây.

SELECT * FROM [SERVER1].[dbo].[TABLE_A] a 
INNER JOIN [SERVER2].[dbo].[TABLE_B] b 
cast(right(a.NAME, len(a.NAME)-charindex('_',A.NAME)) as int) = b.CompanyID 
+0

hmmm ... "Chuyển đổi không thành công khi chuyển đổi giá trị nvarchar 'MYCOMPANY' thành kiểu dữ liệu int." –

+0

Sau đó, có thể dữ liệu không nhất quán, như trong luôn luôn là Companyname_Number. Có thể có dữ liệu giống như thế này "The_Biggest_Company_999"? –

+0

Điều đó là có thể. Tôi chỉ đang tìm một dấu gạch dưới cuối cùng, tiếp theo là một int tự nhiên tùy ý. –

1
Like '%[_]' + Cast(b.CompanyID as Varchar(100)) 

SQL-Fiddle

+0

không có niềm vui, tôi có tên công ty kết thúc bằng chữ số. Tôi nhận được kết quả nhưng những kết quả sai. –

+0

@WimOmbelets, xin lỗi đã nhận được quan điểm của bạn, đã chỉnh sửa .... – bummi

2

Có thể sự cố của bạn là khoảng trắng ở cuối tên công ty. Số documentation chỉ ra:

LIKE hỗ trợ khớp mẫu ASCII và khớp mẫu Unicode. Khi tất cả các đối số (match_expression, pattern và escape_character, nếu có) là kiểu dữ liệu ký tự ASCII, kết hợp mẫu ASCII được thực hiện . Nếu bất kỳ một đối số nào thuộc loại dữ liệu Unicode, tất cả các đối số được chuyển đổi thành đối sánh Unicode và Unicode được thực hiện . Khi bạn sử dụng dữ liệu Unicode (kiểu dữ liệu nchar hoặc nvarchar) với LIKE, khoảng trống cuối có ý nghĩa; tuy nhiên, đối với dữ liệu không phải là Unicode , khoảng trống ở cuối không đáng kể. Unicode LIKE tương thích với tiêu chuẩn ISO. ASCII LIKE tương thích với các phiên bản trước đó của SQL Server.

Đây chỉ là một khả năng. Lưu ý rằng khi bạn sử dụng varchar hoặc nvarchar trong một số convert(), bạn nên luôn luôn bao gồm độ dài. Điều này không ảnh hưởng đến bạn ở đây.

Tôi nghĩ rằng bạn đang tốt hơn với sự so sánh này:

cast(SUBSTRING(a.name, charindex('_', a.name)+1, LEN(a.name)) as int) = b.CompanyId 

Bằng cách sử dụng một equi-join vào CompanyId, bạn có cơ hội sử dụng các chỉ số trên cột đó.

+0

trên ghi chú bên: các giá trị luôn được cắt bớt các không gian đầu và cuối trước khi chèn –

+0

@WimOmbelets. . . Bạn có thể có số 0 đứng đầu trong số không? –

+0

không, không có trường hợp nào là số 0 đứng đầu. –

0

Có lẽ điều này có thể giúp:

SELECT * FROM [SERVER1].[dbo].[TABLE_A] a 
INNER JOIN [SERVER2].[dbo].[TABLE_B] b 
ON a.Name LIKE N'%[_]' + CONVERT(NVARCHAR, b.CompanyID) 

Tôi đã kiểm tra mã của bạn và làm việc của mình một cách hoàn hảo đối với tôi. Lý do duy nhất có thể là không có hồ sơ phù hợp.

0

Có thể không giống như bạn tin, vì hầu hết mã trên trang này (bao gồm cả mã của bạn) đều hoạt động hoặc ít nhất trả lại một cái gì đó.

Tôi khuyên bạn nên chọn các bảng này thành bảng tạm thời cục bộ (cho phép bạn kiểm tra kiểu dữ liệu/độ dài), chạy ltrim(rtrim(...)) ngay cả khi bạn cho rằng mình không cần sử dụng N để đánh dấu các chữ như unicode. các chuỗi của bạn, v.v. Bất kỳ thứ gì có thể làm tăng sự đơn giản hoặc an toàn đều có thể giúp bạn tìm ra vấn đề.

Máy kéo tóc thường kết thúc dưới dạng tấm lót đầu.

SELECT Name INTO #TABLE_A FROM [SERVER1].[dbo].[TABLE_A]; 

SELECT CompanyID INTO #TABLE_B FROM [SERVER1].[dbo].[TABLE_B]; 

-- Now you can check to see that the columns above are what you believe, 
-- and then run your select or any of the selects that have been offered. 

SELECT a.Name, b.CompanyID 
FROM #TABLE_A AS a 
    INNER JOIN #TABLE_B AS b 
     ON LTRIM(RTRIM(a.Name)) LIKE N'%[_]' + CAST(b.CompanyID AS NVARCHAR(11)) 

Ngoài ra, [SERVER1].[dbo].[TABLE_A] trông lạ cho 4-part naming. Thay vào đó, bạn có nghĩa là [DB1].[dbo].[TABLE_A] hoặc [SERVER1].[DB1].[dbo].[TABLE_A]?

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