2012-04-18 22 views
5

Tôi có hai hàm bảng trả về một cột đơn lẻ. Một hàm được đảm bảo trả về cùng một số hàng như một hàng khác.Tham gia hai Kết quả Cùng Kích cỡ theo Số Hàng

Tôi muốn chèn các giá trị vào bảng hai cột mới. Một colum sẽ nhận giá trị từ udf đầu tiên, cột thứ hai từ udf thứ hai. Thứ tự của các chèn sẽ là thứ tự các hàng được trả về bởi các udfs.

Làm cách nào tôi có thể THAM GIA hai udfs này vì chúng không có chung khóa? Tôi đã cố gắng sử dụng một ROW_NUMBER() nhưng có thể không hoàn toàn hình dung nó ra:

INSERT INTO dbo.NewTwoColumnTable (Column1, Column2) 
SELECT udf1.[value], udf2.[value] 
FROM dbo.udf1() udf1 
INNER JOIN dbo.udf2() udf2 ON ??? = ??? 
+0

Làm thế nào để bạn đảm bảo thứ tự của các hàng sắp ra khỏi UDF? –

Trả lời

5

này sẽ không giúp bạn, nhưng SQL không đảm bảo trật tự hàng trừ khi nó được yêu cầu một cách rõ ràng, vì vậy ý ​​tưởng rằng họ sẽ được trả lại theo thứ tự bạn mong đợi có thể đúng cho một tập hợp nhất định, nhưng khi tôi hiểu ý tưởng về các kết quả dựa trên thiết lập, về cơ bản không được đảm bảo để hoạt động đúng. Bạn có thể muốn có một khóa được trả về từ UDF nếu nó được liên kết với một thứ gì đó đảm bảo thứ tự.

Mặc dù vậy, bạn có thể làm như sau:

declare @val int 
set @val=1; 

Select Val1,Val2 from 
(select Value as Val2, ROW_NUMBER() over (order by @val) r from udf1) a 
join 
(select Value as Val2, ROW_NUMBER() over (order by @val) r from udf2) b 
on a.r=b.r 

Biến giải quyết các vấn đề cần một cột để sắp xếp theo.

Nếu bạn có tư cách để chỉnh sửa UDF, tôi nghĩ thực hành tốt hơn là sắp xếp dữ liệu ra khỏi UDF, và sau đó bạn có thể thêm ident int identity(1,1) vào bảng đầu ra của mình trong udf, điều này làm rõ điều này.

Việc reaosn này có thể quan trọng là nếu máy chủ của bạn quyết định chia kết quả udf thành hai gói. Nếu hai đến ra khỏi thứ tự bạn mong đợi, SQL có thể trả lại chúng theo thứ tự nhận được, điều này sẽ hủy hoại giả thiết rằng UDF sẽ trả về các hàng theo thứ tự. Đây có thể không phải là một vấn đề, nhưng nếu kết quả là cần thiết sau này cho một hệ thống thực sự, lập trình thích hợp ở đây ngăn ngừa lỗi bất ngờ sau này.

+0

Menheim: ý tưởng tốt để thêm nhận dạng (1,1) vào đầu ra của udf. – Emmanuel

+0

Nhưng làm thế nào để bạn đảm bảo các giá trị 'nhận dạng' được áp dụng như thế nào? Có điều gì đó trong dữ liệu sắp ra của UDF mà bạn đã có thể sử dụng để quyết định thứ tự bạn muốn không? –

+0

Canoehead: Cảm ơn. Rõ ràng hơn là trả về giá trị một cách rõ ràng, đặc biệt nếu UDF trả về các giá trị đã sắp xếp - các số nguyên khá hẹp, vì vậy chúng bổ sung thêm chi phí tương đối nhỏ. Mặt khác, có những trường hợp, ngay cả khi mã nên, SQL thực sự không đảm bảo thứ tự hàng trả lại, như sửa đổi cuối cùng của tôi chỉ ra. Aaron - Đây là lý do tại sao một chuỗi có thể được sử dụng - lý tưởng chỉ khi thứ tự hàng được sắp xếp ra khỏi UDF. –

3

Trong SQL, "trật tự được trả về bởi các UDFs" không được bảo đảm để tồn tại (thậm chí giữa các cuộc gọi).

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

WITH q1 AS 
     (
     SELECT *, ROW_NUMBER() OVER (ORDER BY whatever1) rn 
     FROM udf1() 
     ), 
     q2 AS 
     (
     SELECT *, ROW_NUMBER() OVER (ORDER BY whatever2) rn 
     FROM udf2() 
     ) 
INSERT 
INTO dbo.NewTwoColumnTable (Column1, Column2) 
SELECT q1.value, q2.value 
FROM q1 
JOIN q2 
ON  q2.rn = q1.rn 
+0

cố gắng trả lại các khóa hàng từ udfs – Infinity

+0

@ShashwatShriparv: Tôi không phải là op. – Quassnoi

+0

@Quassnoi: Bất cứ điều gì1 và whatever2 chính xác là vấn đề. Tôi không có chìa khóa để đặt hàng. – Emmanuel

1

PostgreSQL 9.4+ có thể thêm một cột int8 vào cuối của UDFs kết quả theo sử dụng WITH ORDINALITY suffix

-- set returning function WITH ORDINALITY 
SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n); 
     ls  | n 
-----------------+---- 
pg_serial  | 1 
pg_twophase  | 2 
postmaster.opts | 3 
pg_notify  | 4 

chính thức doc: http://www.postgresql.org/docs/devel/static/functions-srf.html

blogspot liên quan: http://michael.otacoo.com/postgresql-2/postgres-9-4-feature-highlight-with-ordinality/

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