2009-02-04 91 views
14

Tôi cần tạo một công việc nền để xử lý một bảng tìm kiếm các hàng phù hợp trên một id cụ thể với các trạng thái khác nhau. Nó sẽ lưu trữ dữ liệu hàng trong một chuỗi để so sánh dữ liệu với một hàng có id phù hợp.Làm cách nào để so sánh 2 hàng từ cùng một bảng (SQL Server)

Tôi biết cú pháp để lấy dữ liệu hàng nhưng tôi chưa bao giờ thử so sánh 2 hàng từ cùng một bảng trước đó? Làm thế nào là nó được thực hiện? Tôi có cần sử dụng các biến để lưu trữ dữ liệu từ mỗi biến không? Hoặc một số cách khác?

(Sử dụng SQL Server 2008)

Trả lời

10

OK, sau 2 năm đó là cuối cùng thời gian để sửa cú pháp:

SELECT t1.value, t2.value 
FROM MyTable t1 
JOIN MyTable t2 
ON  t1.id = t2.id 
WHERE t1.id = @id 
     AND t1.status = @status1 
     AND t2.status = @status2 
+3

Bạn KHÔNG nên sử dụng cú pháp đó. Thay vào đó hãy sử dụng các kết hợp cụ thể. Các hình thức tham gia trái và phải của cú pháp đó không được chấp nhận. Tôi sẽ không ngạc nhiên khi thấy biểu mẫu này không được chấp nhận trong phiên bản tiếp theo. – HLGEM

+0

@HLGEM - Bạn có thể cung cấp liên kết đến nơi mà điều này được đề cập là không được dùng nữa không? – Pauk

+3

@Pauk ms-help: //MS.SQLCC.v10/MS.SQLSVR.v10.en/s10sq_GetStart/html/c10eeaa5-3d3c-49b4-a4bd-5dc4fb190142.htm Và ngay cả khi họ không sử dụng trái và phải các phiên bản không nên được sử dụng khi chúng cho kết quả không nhất quán và đôi khi không chính xác. Đôi khi chúng có thể được hiểu là tham gia chéo thay vì tham gia trái hoặc phải. – HLGEM

6

Một số người tìm thấy những cú pháp thay thế sau đây dễ dàng hơn để xem những gì đang xảy ra:

select t1.value,t2.value 
from MyTable t1 
    inner join MyTable t2 on 
     t1.id = t2.id 
where t1.id = @id 
28

Bạn có thể tham gia một bảng với chính nó bao nhiêu lần tùy thích, được gọi là self join.

Một bí danh được gán cho từng trường hợp của bảng (như trong ví dụ bên dưới) để phân biệt một thể hiện với bảng khác.

SELECT a.SelfJoinTableID 
FROM dbo.SelfJoinTable a 
     INNER JOIN dbo.SelfJoinTable b 
     ON a.SelfJoinTableID = b.SelfJoinTableID 
     INNER JOIN dbo.SelfJoinTable c 
     ON a.SelfJoinTableID = c.SelfJoinTableID 
WHERE a.Status = 'Status to filter a' 
     AND b.Status = 'Status to filter b' 
     AND c.Status = 'Status to filter c' 
+6

Tốt cho bạn để đề cập rằng bạn phải bí danh – HLGEM

+16

không thực sự nhiều lần như bạn yêu cầu .. có giới hạn tham chiếu 256 bảng trong truy vấn:] – pkmiec

+0

@pkmiec hấp dẫn như âm thanh, [Microsoft tài liệu giới hạn về SQL Server] (https://docs.microsoft.com/en-us/sql/sql-server/maximum-capacity-specifications-cho-sql-server) khác với đối số của bạn - 'Bảng cho mỗi câu lệnh SELECT - Chỉ giới hạn bởi các tài nguyên có sẵn'. Tôi vẫn không chắc liệu tôi có sử dụng thông tin này hay không trừ khi tôi thiết kế một thứ gì đó thật khủng khiếp nhưng tôi muốn biết làm thế nào bạn có được con số đó, nó chắc chắn trông hấp dẫn. –

1
SELECT * FROM A AS b INNER JOIN A AS c ON b.a = c.a 
WHERE b.a = 'some column value' 
2

SELECT COUNT(*) FROM (SELECT * FROM tbl WHERE id=1 UNION SELECT * FROM tbl WHERE id=2) a

Nếu bạn có hai hàng, họ khác nhau, nếu một - giống nhau.

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