2009-04-27 31 views
5

Tôi đang sử dụng SQL2000 và tôi muốn tham gia vào hai bảng với nhau dựa trên vị trí của họLàm thế nào để tham gia hai bảng cùng với cùng một số lượng hàng theo lệnh của họ

Ví dụ xem xét 2 bảng sau:

 
table1 
------- 
name 
------- 
'cat' 
'dog' 
'mouse' 

table2 
------ 
cost 
------ 
23 
13 
25 

bây giờ tôi muốn một cách mù quáng tham gia hai bảng với nhau như sau dựa trên thứ tự của chúng không phải trên một cột phù hợp (tôi cũng có thể đảm bảo cả hai bảng có cùng số hàng):

 
-------|----- 
name |cost 
-------|------ 
'cat' |23 
'dog' |13 
'mouse'|25 

Điều này có khả thi trong một T-SQL chọn không ??

+0

tại sao ..... tại sao bạn lại xây dựng một cơ sở dữ liệu để sử dụng theo cách này? Toàn bộ điểm cơ sở dữ liệu là không làm điều này. –

Trả lời

2

vào năm 2000, bạn sẽ phải chạy 2 con trỏ chỉ về phía trước và chèn vào bảng tạm thời. hoặc chèn các giá trị vào bảng tạm thời với cột nhận dạng bổ sung và tham gia 2 bảng tạm thời trên trường nhận dạng

+0

bạn không cần con trỏ, hãy xem câu trả lời của tôi ... –

+0

@ Giống như vậy, nó phụ thuộc vào những gì bạn đang cố gắng đạt được, nếu bạn cần chạy một thao tác trên mỗi cặp thì tập con trỏ có khả năng nhanh hơn đẩy tất cả dữ liệu vào một tập hợp các bảng tạm thời (đó là gợi ý thứ hai của tôi) –

0

Xem xét sử dụng xếp hạng (rownum trong Oracle) để tự động áp dụng số duy nhất được đặt cho mỗi bảng. Chỉ cần tham gia vào cột xếp hạng và bạn nên có những gì bạn cần. Xem này Microsoft article on numbering rows.

1

Bạn có bất kỳ thứ gì đảm bảo thứ tự của từng bảng không?

Như xa rìu tôi biết, máy chủ SQL không đưa ra bất kỳ lời hứa nào về thứ tự của một kết quả trừ khi truy vấn bên ngoài có thứ tự theo mệnh đề. Trong trường hợp của bạn, bạn cần Mỗi bảng được đặt hàng một cách xác định để làm việc này.

Ngoài ra, trong SQL 2000, như được trả lời trước tôi, một bảng tạm thời và hai con trỏ có vẻ như là một câu trả lời hay.

Cập nhật: Ai đó đã đề cập chèn cả hai bảng vào bảng tạm thời và nó sẽ mang lại hiệu suất tốt hơn. Tôi không phải là chuyên gia SQL vì vậy tôi trì hoãn những người biết về mặt trận đó, và kể từ khi tôi có một cuộc bỏ phiếu, tôi nghĩ bạn nên điều tra những cân nhắc về hiệu suất đó. Nhưng trong mọi trường hợp, nếu bạn không có bất kỳ thông tin nào khác trong bảng của bạn so với những gì bạn đã cho chúng tôi thấy tôi không chắc chắn bạn có thể kéo nó ra, đặt hàng khôn ngoan.

0

sẽ là tốt nhất để sử dụng row_number(), nhưng đó là chỉ cho năm 2005 và 2008, điều này sẽ làm việc cho 2000 ...

Hãy thử điều này:

create table table1 (name varchar(30)) 
insert into table1 (name) values ('cat') 
insert into table1 (name) values ('dog') 
insert into table1 (name) values ('mouse') 

create table table2 (cost int) 
insert into table2 (cost) values (23) 
insert into table2 (cost) values (13) 
insert into table2 (cost) values (25) 

Select IDENTITY(int,1,1) AS RowNumber 
, Name 
INTO #Temp1 
from table1 


Select IDENTITY(int,1,1) AS RowNumber 
, Cost 
INTO #Temp2 
from table2 

select * from #Temp1 
select * from #Temp2 

SELECT 
    t1.Name, t2.Cost 
    FROM #Temp1     t1 
     LEFT OUTER JOIN #Temp2 t2 ON t1.RowNumber=t2.RowNumber 
    ORDER BY t1.RowNumber 
+0

Tại sao một bên ngoài tham gia bên ngoài, nếu bạn biết cả hai bảng có cùng một số hàng? – Joe

2

Nếu bảng của bạn không hai lớn, bạn có thể tạo hai bảng tạm thời trong bộ nhớ và chọn nội dung của bạn vào chúng theo một thứ tự cụ thể, và sau đó nối chúng vào hàng số.

ví dụ:

CREATE TABLE #Temp_One (
    [RowNum] [int] IDENTITY (1, 1) NOT NULL , 
    [Description] [nvarchar] (50) NOT NULL 
) 

CREATE TABLE #Temp_Two (
    [RowNum] [int] IDENTITY (1, 1) NOT NULL , 
    [Description] [nvarchar] (50) NOT NULL 
) 

INSERT INTO #Temp_One 
SELECT Your_Column FROM Your_Table_One ORDER BY Whatever 

INSERT INTO #Temp_Two 
SELECT Your_Column FROM Your_Table_Two ORDER BY Whatever 

SELECT * 
FROM #Temp_One a 
    LEFT OUTER JOIN #Temp_Two b 
     On a.RowNum = b.RowNum 
+1

Điều gì khiến bạn nghĩ rằng các bảng tạm thời này nằm trong bộ nhớ? – tpdi

+0

Biến cụm từ ... Tôi biết họ đang ở trong TempDB ... quan điểm của tôi là đây là một cách hữu ích để làm những gì anh ta muốn cho các bảng với một vài nghìn hàng, nhưng không cho các bảng có vài triệu hàng ... –

+0

Nếu bạn muốn trong các bảng bộ nhớ, bạn sẽ cần phải khai báo chúng như là bảng var (với ký hiệu @) điều hạn chế kích thước của các bảng tạm thời ở đây là kích thước của cơ sở dữ liệu tempdb. –

0

Xynth - xây dựng trong số hàng không có sẵn cho đến khi SQL2K5 không may, và ví dụ được đưa ra bởi microsoft thực sự sử dụng tam giác tham gia - một khủng khiếp hiệu suất ẩn hit nếu các bảng được lớn. Cách tiếp cận ưa thích của tôi sẽ là một chèn vào một cặp bảng tạm thời bằng cách sử dụng chức năng nhận dạng và sau đó tham gia vào những, mà về cơ bản là câu trả lời tương tự đã được đưa ra. Tôi nghĩ rằng cách tiếp cận hai con trỏ âm thanh nặng hơn nhiều so với nó cần cho nhiệm vụ này.

+0

Tôi đồng ý rằng hiệu suất sẽ là khủng khiếp, nhưng nếu bạn đang lập kế hoạch sử dụng DB này về phía trước tôi nghĩ rằng hiệu suất có thể sẽ không phải là vấn đề lớn nhất của bạn. Tôi đã hy vọng bạn đang tìm kiếm một giải pháp để biến đổi cơ sở dữ liệu của bạn thành một hóa thân duy trì được nhiều hơn. – Mark

+0

Ah ok. Điều đó có ý nghĩa sau đó. (cơn ác mộng đột ngột của các hệ thống của chúng tôi thực sự là như thế này không có chìa khóa, vv ... agh.) –

0

Bạn có thể thay đổi cả hai bảng để có cột auto_increment, sau đó tham gia vào đó.

Như những người khác đã nói với bạn, SQL không có thứ tự nội tại; một bảng các hàng là một tập hợp. Bất kỳ đơn đặt hàng nào bạn nhận được là tùy ý, trừ khi bạn thêm một mệnh đề order by.

Vì vậy, vâng, có nhiều cách bạn có thể làm điều này, nhưng tất cả đều phụ thuộc vào việc đặt hàng ngẫu nhiên là điều bạn mong đợi. Vì vậy, làm điều này một lần, và không làm điều đó một lần nữa trừ khi bạn có thể đến với một cách (auto_increments, phím tự nhiên, một cái gì đó) để đảm bảo đặt hàng.

5

Đây là KHÔNG có thể, vì hoàn toàn không có bảo đảm về thứ tự các hàng sẽ được chọn.

Có một số cách để đạt được những gì bạn muốn (xem câu trả lời khác) miễn là bạn sắp xếp theo thứ tự sắp xếp, nhưng không có cách nào hoạt động nếu bạn không làm như vậy. truy vấn.

Buộc phải thực hiện loại truy vấn này có mùi mạnh về thiết kế cơ sở dữ liệu kém.

1

Tuyệt đối. Sử dụng truy vấn sau đây nhưng hãy đảm bảo rằng mệnh đề (theo thứ tự) sử dụng cùng một cột thứ tự các hàng sẽ thay đổi mà bạn không muốn.

select 
(
row_number() over(order by name) rno, * from Table1 
) A 
(
row_number() over(order by name) rno, * from Table2 
) B 
JOIN A.rno=B.rno 

trật tự quy định tại khoản có thể được sửa đổi theo linkings dùng

Các truy vấn trên tạo row_numbers duy nhất cho mỗi hàng, mà một được nối với row_numbers của bảng khác

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