фильтровать дубликаты в соединении SQL - PullRequest
3 голосов
/ 12 июня 2010

При использовании SQL-соединения возможно ли сохранить только те строки, которые имеют одну строку для левой таблицы?

Например:

select * from A, B where A.id = B.a_id;

a1 b1
a2 b1
a2 b2

В этом случае я хочу удалить все, кроме первой строки, где одна строка из A соответствует ровно 1 строке из B.

Я использую MySQL.

Ответы [ 4 ]

4 голосов
/ 12 июня 2010

Это должно работать в MySQL:

select * from A, B where A.id = B.a_id GROUP BY A.id HAVING COUNT(*) = 1;

Для тех из вас, кто не использует MySQL, вам нужно будет использовать статистические функции (например, min () или max ()) во всех столбцах (кроме A)..id) чтобы ваша база данных не жаловалась.

0 голосов
/ 13 июня 2010

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

Как обычно, при сравнении различных возможных решений предлагается сравнение / сравнение планов выполнения.

select
  *
from
  A
  join B on A.id = B.a_id
where
  not exists (
    select
      1
    from
      B B2
    where 
      A.id = b2.a_id 
      and b2.id != b.id
  )
0 голосов
/ 13 июня 2010

Во-первых, я бы рекомендовал использовать синтаксис JOIN вместо устаревшего синтаксиса разделения таблиц запятыми. Во-вторых, если A.id является первичным ключом таблицы A, вам нужно только проверить таблицу B на наличие дубликатов:

Select ...
From A
    Join B
        On B.a_id = A.id
Where Exists    (
                Select 1
                From B B2
                Where B2.a_id = A.id
                Having Count(*) = 1
                )
0 голосов
/ 13 июня 2010

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

Вот возможное решение, если предположить, что ID является ключом-кандидатом таблицы B.

SELECT *
FROM A, B
WHERE B.id =
 (SELECT MIN(B.id)
  FROM B
  WHERE A.id = B.a_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...