2012-03-07 34 views
13
X Y DATE 
1 20 20120101 
1 21 20120101 
2 30 20120201 
3 40 20120201 
3 41 20120301 

Tôi muốn chọn bất kỳ hàng nào có một hàng khác trong đó X là như nhau, nhưng ngày là khác nhau, tức là câu trả lời sẽ làchọn hàng giống nhau trong một cột, nhưng khác nhau trong một

3 40 20120201 
3 41 20120301 
+0

mà cơ sở dữ liệu và phiên bản? –

+0

Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64) Mar 29 2009 10:11:52 Bản quyền (c) 1988-2008 Microsoft Corporation Developer Edition (64 bit) trên Windows NT 6.0 (Phiên bản 6002: Gói Dịch vụ 2) .... tại sao? – gmaximus

+0

Bởi vì sql của tôi sẽ chỉ hoạt động từ sqlserver 2008+. –

Trả lời

20

Hãy thử này ...

SELECT * 
FROM YourTable 
WHERE X IN (
    SELECT T1.X 
    FROM YourTable T1 INNER JOIN 
     YourTable T2 ON T1.X = T2.X 
    WHERE T1.DATE <> T2.DATE 
); 

này nên làm việc trong hầu hết các sản phẩm cơ sở dữ liệu ANSI-compliant.

+0

đây là một câu trả lời làm việc, bằng cách thực hiện sql của nhà cung cấp của tôi không cho phép lựa chọn lồng nhau - nhưng tôi đánh giá cao sự giúp đỡ – gmaximus

+0

tôi thực sự nghĩ rằng tôi vẫn còn một chút nhầm lẫn, bạn có thể đưa ra câu trả lời cho chỉ x và y cột ở trên để câu hỏi, 'có cùng Y và khác với X'? – gmaximus

+2

@gmaximus: Bạn đã gắn thẻ câu hỏi của mình với sql-server-2008 và bạn đã nói rằng bạn đang sử dụng SQL Server 2008. Vậy ý của bạn là gì khi bạn nói triển khai sql của nhà cung cấp không cho phép chọn lồng nhau? SQL Server 2008 chắc chắn cho phép lựa chọn lồng nhau. –

2
select distinct t1.* 
    from table t1 
    join table t2 
    on (t1.X = t2.X and t1.date <> t2.date); 
+0

@Yuck Tôi không có cơ hội để thử nghiệm nó, nhưng bạn có chắc chắn không? Dường như với tôi rằng truy vấn này sẽ cho kết quả cần thiết. –

+0

@Yuck Tôi đã thử nghiệm nó và nó hoạt động tốt. –

+0

'table' là một từ khóa SQL, điều này sẽ ngăn không cho nó chạy. Bạn đã thực sự chạy thử nghiệm cái gì? Và RDBMS nào? – Yuck

0
declare @t table(X int, Y int, DATE CHAR(8)) 
insert @t values 
(1, 20, '20120101'), 
(1, 21, '20120101'), 
(2, 30, '20120201'), 
(3, 40, '20120201'), 
(3, 41, '20120301') 

select x,y, date, maxy, miny from 
(
    select *, max(date) over (partition by x) maxdate, 
    min(date) over (partition by x) mindate 
    from @t 
) a 
where mindate <> maxdate 
Các vấn đề liên quan