2012-05-22 24 views
5

Tôi đang sử dụng SQL Server 2008. Tôi có 2 biến bảng nhưLàm thế nào để kết hợp các cột từ 2 bảng vào 1 mà không sử dụng THAM GIA

FirstName 
========== 
Little 
John 
Baby 

LastName 
========== 
Timmy 
Doe 
Jessica 

Và tôi muốn các bảng kết quả là:

First  Last 
===================== 
Little  Timmy  
John  Doe  
Baby  Jessica 

Lưu ý rằng không có PK có thể tham gia 2 bảng. Tôi đang cố gắng sử dụng một con trỏ nhưng không chắc chắn làm thế nào để bắt đầu.

---- Cập nhật -----

Tôi biết đó là một trường hợp hiếm gặp, nhưng tôi đang viết một kịch bản để dọn dẹp dữ liệu di sản. Cách duy nhất chúng ta biết "Little" đi với "Timmy" là cả hai đều là kỷ lục đầu tiên của bảng. Nó sẽ giúp ích nếu chúng ta có PK cho các bảng nhưng không có mối quan hệ?

ID FirstName 
========== 
1 Little 
2 John 
3 Baby 
---------- 

ID LastName 
========== 
4 Timmy 
5 Doe 
6 Jessica 
---------- 

Tôi không quen với TSQL vì vậy tôi nghĩ tôi có thể lặp qua 2 bảng như lặp qua mảng trong bộ nhớ.

+2

@Xi .... không có PK, bạn chắc chắn rằng Little đi với Timmy, vv. của các hồ sơ yếu tố quyết định? – MikeTWebb

+0

Tại sao bạn muốn thực hiện việc này? –

+1

người đàn ông, không có bất kỳ khóa chính nào bạn không thể 'JOIN',' Con trỏ', v.v. – Sajmon

Trả lời

6

Bạn có thể thử một cái gì đó như thế này, để phù hợp dựa trên số hàng:

SELECT FirstName AS First, LastName AS Last 
FROM 
(
    SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, FirstName 
    FROM FirstName 
) t1 
INNER JOIN 
(
    SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, LastName 
    FROM LastName 
) t2 
ON t1.RowNum = t2.RowNum 

Nhưng đừng coi đây là một dấu hiệu cho thấy bạn không cần chìa khóa.

+0

+1 đặc biệt đối với nhận xét "không cần khóa". –

+0

Tôi "downvoting nó bởi vì câu hỏi là khá rõ ràng rằng không có id trong hai bảng.Đơn đặt hàng của bạn bằng cú pháp sai. –

+0

@GordonLinoff: Tôi đang xem phiên bản cập nhật của các bảng, trong đó có chứa các cột ID mà chúng tôi có thể sử dụng để đặt hàng. –

1

Không có nội dung nào như "bản ghi đầu tiên". Thứ tự đọc hoàn toàn không được xác định. Điều này cũng đúng trong thực tế! Bạn sẽ xem thứ tự hàng ngẫu nhiên trong thực tế.

Bạn cần để xác định thứ tự sắp xếp. Sau khi thực hiện việc đó, bạn có thể truy vấn như sau:

SELECT FirstName AS First, LastName AS Last 
FROM 
(
    SELECT ROW_NUMBER() OVER (ORDER BY ID) AS r, FirstName 
    FROM FirstName 
) t1 
INNER JOIN 
(
    SELECT ROW_NUMBER() OVER (ORDER BY ID) AS r, LastName 
    FROM LastName 
) t2 
ON t1.r = t2.r 

Lưu ý trình giữ chỗ "SORT ORDER HERE". Cần điền vào. Ví dụ: "ID" hoặc "FirstName".

Chỉnh sửa: Đã xem bản chỉnh sửa của bạn, tôi đã thêm thứ tự sắp xếp trên ID. Điều này sẽ làm việc ngay bây giờ.

+0

Tôi lấy mã từ cái mà anh ta đã xóa (lý do tôi không biết - đó là một khởi đầu tốt) Không có gì sai khi làm điều đó.Tôi đã sửa mã, và thêm rất nhiều bình luận – usr

+0

@usr: khi tôi đăng lần đầu tiên nó, không có cột ID trong câu hỏi của OP. Nếu không có (hoặc hacking các bảng để thêm một cái gì đó trong) không có cách nào để làm một đơn đặt hàng, vì vậy tôi đã xóa và thêm một bình luận cho biết trong OP họ cần một cách để sắp xếp. –

+0

Tôi đã chỉnh sửa mã để đặt hàng theo ID. Giải pháp này sẽ hoạt động .; @AdamV, lấy mã của bạn không phải là một hành động nguy hiểm. Tôi đã tự sản xuất mã tương tự. Đánh lại nó sẽ là một sự lãng phí thời gian. – usr

0

Đây là một hack, mà có thể làm việc trong trường hợp của bạn:

select t1.id, t1.name, t2.name 
from (select name, row_number() over (partition by null order by (select NULL)) as id 
     from t1 
    ) t1 join 
    (select name, row_number() over (partition by null order by (select NULL)) as id 
     from t2 
    ) t2 
    on t1.id = t2.id 

Theo kinh nghiệm của tôi, các row_number() với subquery cho thứ tự bằng phương tiện mà không có loại thực sự được thực hiện, nhưng các hàng là mang theo tuần tự. Điều này có nhiều khả năng hoạt động nếu bạn đang sử dụng một cá thể luồng đơn.

Và, tôi không đảm bảo rằng nó sẽ hoạt động! Chắc chắn kiểm tra kết quả! Nếu điều này không hiệu quả, bạn có thể có được hiệu ứng tương tự bằng cách sử dụng các bảng tạm thời.

Dữ liệu này có phải từ bên ngoài thế giới cơ sở dữ liệu không? Nếu bạn phải thực hiện quá trình này nhiều lần, thì bạn nên xử lý vấn đề bên ngoài hoặc trên đầu vào vào cơ sở dữ liệu.

2

Bạn không thể tin cậy tham gia hai biến bảng này mà không có danh tính.Giả sử họ đang được dân cư một cách tự ở nơi đầu tiên, mỗi bảng có thể được tạo ra với bản sắc như sau:

DECLARE @first TABLE(ID INT IDENTITY(1,1), NameFirst VARCHAR(30)); 
DECLARE @last TABLE(ID INT IDENTITY(1,1), NameLast VARCHAR(30)); 

-- Note that we don't need to list column names here 
INSERT INTO @first VALUES('Little'); 
INSERT INTO @first VALUES('John'); 
INSERT INTO @first VALUES('Baby'); 

INSERT INTO @last VALUES('Timmy'); 
INSERT INTO @last VALUES('Doe'); 
INSERT INTO @last VALUES('Jessica'); 

SELECT n1.NameFirst 
, n2.NameLast 
FROM @first n1 
INNER JOIN @last n2 ON n1.ID=n2.ID; 

Kết quả:

NameFirst      NameLast 
------------------------------ ------------------------------ 
Little       Timmy 
John       Doe 
Baby       Jessica 
+4

Hãy cẩn thận, không có 'MAXDOP' mệnh đề' VALUES' của bạn có thể được chèn vào theo thứ tự bất kỳ, nghĩa là bạn có thể không nhận được kết quả tương tự mỗi lần (đây là lý do tại sao chúng tôi hỏi câu hỏi về cách xác định giá trị ID). Cấp, nó không chắc rằng nó sẽ bao giờ khác nhau, nhưng nó không được đảm bảo để cư xử giống nhau mỗi lần. –

+1

@AaronBertrand Mục tiêu ở đây là thứ tự của ID, do đó, đột nhập vào các câu lệnh riêng biệt nên giải quyết khả năng đó, như đã chỉnh sửa ở trên. –

+0

Có, tốt hơn nhiều :-) - bây giờ, chúng tôi chỉ không có ý tưởng nếu OP có khả năng xác định thứ tự chèn theo cách này. Nếu nó là INSERT ...SELECT FROM some_other_table và bảng đó cũng không có khóa, vẫn không có cách nào để xác định một cách đáng tin cậy "đầu tiên" ... –

0

xây dựng trên giải pháp @JohnDewey trình bày, bạn có thể sắp xếp các bản ghi vào các biến bảng. Trong thực tế, nó sẽ tạo mối quan hệ giữa các giá trị dựa trên thứ tự của các bản ghi:

DECLARE @first TABLE(sequence INT IDENTITY(1,1), FirstName VARCHAR(30)); 
DECLARE @last TABLE(sequence INT IDENTITY(1,1), LastName VARCHAR(30)); 

INSERT INTO @first(FirstName) 
SELECT FirstName FROM TableFisrt ORDER BY id; 
-- sequence FirstName 
-- ======== ========= 
--  1 Little 
--  2 John 
--  3 Baby 

INSERT INTO @last(LastName) 
SELECT FirstName FROM TableLast ORDER BY id; 
-- sequence LastName 
-- ======== ========= 
--  1 Timmy 
--  2 Doe 
--  3 Jessica 

SELECT frs.FirstName, lst.LastName 
FROM @first frs 
INNER JOIN @last lst ON frs.sequence = lst.sequence; 
-- sequence FirstName 
-- ======== ========= 
-- Little Timmy 
-- John  Doe 
-- Baby  Jessica 
+0

Vẫn còn cùng một vấn đề - việc gán giá trị nhận dạng không được đảm bảo trừ khi bạn sử dụng 'MAXDOP 1' ... –

+0

@AaronBertrand là đúng, mặc dù trong SQL Server của tôi kinh nghiệm trả về hàng theo thứ tự chúng được chèn vào khi bảng không ' t có một chỉ mục nhóm, nó không thực hiện bất kỳ sự bảo đảm nào về hành vi này - đây có thể là một tác dụng phụ của ID thay thế mà công cụ tạo ra. Nói đúng ra, không có giải pháp sử dụng đại số quan hệ hoặc lý thuyết tập hợp (vì chúng bỏ qua thứ tự), nhưng đề xuất này ** có thể là một cách tiếp cận đủ tốt để thử. –

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