Соедините две таблицы, где одна не уникальна - PullRequest
1 голос
/ 21 декабря 2010

Привет всем.Мне нужно объединить две таблицы в соответствии с этими параметрами:

1) Мне нужны только данные, которые находятся как в первой, так и во второй таблице

2) Данные во второй таблице могут иметь большестроки прикреплены к одной строке первой таблицы, но мне нужно, чтобы эти строки отображались только один раз.

Я пробовал это

SELECT * FROM table AS p
            JOIN `table2` AS ps ON (p.id = ps.`id_table2`)
            ORDER BY p.id

, но я получаю дубликаты, как уже упоминалось.

Спасибо

Ответы [ 4 ]

3 голосов
/ 21 декабря 2010

Предполагая, что вы заботитесь только о конечном результате, используйте различные:

SELECT distinct * FROM table AS p
         JOIN `table2` AS ps ON (p.id = ps.`id_table2`)
         ORDER BY p.id
1 голос
/ 21 декабря 2010

Предполагая MySQL:

SELECT  *
FROM    table1 t1
JOIN    table2 t2
ON      t2.id =
        (
        SELECT  id
        FROM    table2 t2i
        WHERE   t2i.id_table2 = t1.id
        ORDER BY
                id
        LIMIT 1
        )

Измените предложение ORDER BY, чтобы определить, какую из нескольких записей вы хотите.

В SQL Server, Oracle и PostgreSQL (8.4+), используйте этот синтаксис:

SELECT  *
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t2.id) AS rn
        FROM    table1 t1
        JOIN    table2 t2
        ON      t2.id_table2 = t1.id
        ) q
WHERE   rn = 1

Снова измените ORDER BY соответственно.

1 голос
/ 21 декабря 2010
SELECT distinct * FROM table AS p
            JOIN `table2` AS ps ON (p.id = ps.`id_table2`)
            ORDER BY p.id

Что должно избавить от дубликатов? Это то, что вы ищете?

1 голос
/ 21 декабря 2010

Чтобы свернуть группу строк в одну строку в наборе результатов, используйте предложение GROUP BY. Предложение GROUP BY должно указывать все столбцы, которые имеют одинаковые значения в каждом наборе, чтобы свернуть их в одну строку. Ваш запрос не должен SELECT содержать какие-либо столбцы, которые не являются частью предложения GROUP BY, если они не являются агрегированными столбцами, что позволяет СУБД знать, какое из значений вы хотите.

Если вам нужны только столбцы из одной таблицы, у которых есть соответствующая строка в другой, то вам вообще не нужно объединение или группа.

SELECT * FROM table1 WHERE some_column IN (SELECT related_column FROM table2)

или используйте предложение WHERE EXISTS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...