PL / SQL - Как вернуть одну строку из объединенной таблицы - PullRequest
6 голосов
/ 28 января 2011

это может быть довольно просто, я просто не вижу древесину для деревьев в данный момент. В Oracle я выбираю записи из таблицы A, которые присоединяются к таблице B на основе первичного ключа таблицы A. Однако таблица B может иметь несколько записей, соответствующих первичному ключу таблицы A. Это приводит к тому, что мой запрос возвращает дублирующиеся строки из таблицы A. Ниже приведена сокращенная версия моего запроса:

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

Это возвращает 2 записи для Sec2 - как я могу получить только 1 запись для Sec2? Я пытался использовать уникальные и уникальные, но все же получить те же результаты.

Ответы [ 4 ]

12 голосов
/ 28 января 2011
SELECT  secid, secname
FROM    tableA
WHERE   secid IN
        (
        SELECT  secid
        FROM    tableb
        )

Если вам нужна запись из tableB:

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 определяет, какую из нескольких записей в b вы получите.

2 голосов
/ 28 января 2011

Вы можете использовать функцию GROUP, чтобы выбрать только одну строку:

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 голосов
/ 29 января 2011

Предлагаемые решения очень хороши. Бывают случаи, когда вам может потребоваться немного другой подход, особенно когда одна из таблиц очень велика по сравнению с другой и отсутствует индекс для столбца внешнего ключа в таблице B.

0 голосов
/ 28 января 2011
SELECT DISTINCT a.secid, a.secname
  FROM tableA a, tableB b
 WHERE a.secid = b.secid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...