2011-01-28 19 views
6

điều này có thể khá đơn giản Tôi không thấy gỗ cho cây vào lúc này. Trong Oracle tôi đang chọn các bản ghi từ bảng A tham gia bảng B dựa trên khóa chính của bảng A. Tuy nhiên bảng B có thể có nhiều bản ghi khớp với khóa chính của bảng A. Điều này làm cho truy vấn của tôi trả về các hàng trùng lặp từ bảng A. Dưới đây là một phiên bản cắt giảm của truy vấn của tôi:PL/SQL - Cách trả về hàng đơn lẻ từ một bảng đã nối

TableA    TableB 
_______    _________ 
1, Sec1    2, 11/01/2011 
2, Sec2    2 
3, Sec3    5, 10/01/2011 
4, Sec4    6, 10/01/2011 

Select A.SecID, A.SecName, B.DateSent from tableA A 
    inner join tableB B on A.SecID = B.SecID 

này đang trở lại 2 hồ sơ cho Sec2 - làm thế nào tôi có thể nhận được nó để trở về chỉ có 1 kỷ lục cho Sec2? Tôi đã thử sử dụng riêng biệt và độc đáo nhưng vẫn nhận được kết quả tương tự.

+0

Xin lỗi tôi đã đơn giản hóa điều này ban đầu. Tôi thực sự cần một giá trị ngày tháng từ bảng B cũng như –

+2

Giá trị ngày của hai bản ghi đó? – Quassnoi

+0

Bản ghi trong bảngB với ngày gần đây nhất. Một số bản ghi có thể không có giá trị ngày tháng. –

Trả lời

12
SELECT secid, secname 
FROM tableA 
WHERE secid IN 
     (
     SELECT secid 
     FROM tableb 
     ) 

Nếu bạn cần một bản ghi từ tableB cũng như:

SELECT secid, secname, datesent 
FROM (
     SELECT a.secid, a.secname, b.datesent, ROW_NUMBER() OVER (PARTITION BY a.secid ORDER BY b.datesent DESC) AS rn 
     FROM tableA a 
     JOIN tableB b 
     ON  b.secid = a.secid 
     ) 
WHERE rn = 1 

ORDER BY điều khiển điều khoản nào trong số nhiều bản ghi trên b bạn sẽ nhận được.

+0

tốt nhất đã làm các trick :) –

0
SELECT DISTINCT a.secid, a.secname 
    FROM tableA a, tableB b 
WHERE a.secid = b.secid; 
2

Bạn có thể sử dụng một hàm GROUP để chọn chỉ có một hàng:

SELECT A.SecID, A.SecName, max(B.DateSent) DateSent 
    FROM tableA A 
    JOIN tableB B on A.SecID = B.SecID 
GROUP BY A.SecID, A.SecName 
+0

Hi @Vincent cảm ơn - truy vấn đầy đủ của tôi có khoảng 40 lĩnh vực, do đó, điều này có nghĩa là thêm tất cả các lĩnh vực ngoại trừ B.DateSent đến khoản Group By, trừ khi có một cách khác nhau. –

+0

Nếu bạn có rất nhiều lĩnh vực, giải pháp của Quassnoi chắc chắn là con đường để đi. –

0

Các giải pháp đề xuất là rất tốt. Có những trường hợp khi bạn có thể có cách tiếp cận khác một chút, đặc biệt khi một trong các bảng rất lớn so với cột khác và không có chỉ mục trên cột khóa ngoài trong bảng B.

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