Используйте два оператора DISTINCT в SQL - PullRequest
2 голосов
/ 12 января 2012

Я объединил две разные таблицы, одна сторона называется DynDom, а другая - CATH.Я пытаюсь удалить дубликаты из этой таблицы, как показано ниже: enter image description here

Однако, если я выбираю отдельный DdndomDDcode из таблицы, он возвращает различные значения этого pdbcode.DynDom table и

CATH

Основываясь на рисунках выше, я закомментировал столбцы DynDom / CATH в таблице и запустил запрос отдельно для DynDom / CATH, и он вернул эти значениясоответственно, это то, что мне нужно, и мне было интересно, можно ли мне использовать 2 разных оператора для возврата разных значений всей таблицы на основе кода pdb.

Вот мой код:

select DISTINCT
    cath_dyndom_table_2."DYNDOM_DOMAINID",
    cath_dyndom_table_2."DYNDOM_DSTART",
    cath_dyndom_table_2."DYNDOM_DEND",
    cath_dyndom_table_2."DYNDOM_CONFORMERID",
    cath_dyndom_table_2.pdbcode,
    cath_dyndom_table_2."DYNDOM_ChainID",
    cath_dyndom_table_2.cath_pdbcode,
    cath_dyndom_table_2."CATH_BEGIN",
    cath_dyndom_table_2."CATH_END"
from 
    cath_dyndom_table_2 
where 
    pdbcode = '2hun'
order by 
    cath_dyndom_table_2."DYNDOM_DOMAINID",
    cath_dyndom_table_2."DYNDOM_DSTART",
    cath_dyndom_table_2."DYNDOM_DEND",
    cath_dyndom_table_2.pdbcode,
    cath_dyndom_table_2.cath_pdbcode,
    cath_dyndom_table_2."CATH_BEGIN",
    cath_dyndom_table_2."CATH_END";

В конце я хотел бы искать домены из DynDom и CATH, основываясь на pdbcode и возвращать строки без повторяющихся значений.

Спасибо.

ОБНОВЛЕНИЕ:

Это моя таблица ПРОСМОТРА, которую я сделал.

    CREATE VIEW cath_dyndom_table AS
SELECT
  r.domainid AS "DYNDOM_DOMAINID",
  r.DomainStart AS "DYNDOM_DSTART",
  r.Domain_End AS "DYNDOM_DEND",
  r.ddid AS "DYN_DDID",
  r.confid AS "DYNDOM_CONFORMERID",
  r.pdbcode,
  r.chainid AS "DYNDOM_ChainID",
  d.cath_pdbcode,
  d.cathbegin AS "CATH_BEGIN",
  d.cathend AS "CATH_END"
FROM dyndom_domain_table r
  FULL OUTER JOIN cath_domains d ON d.cath_pdbcode::character(4) = r.pdbcode 
  ORDER BY confid ASC;

Ответы [ 2 ]

3 голосов
/ 12 января 2012

То, что вы получаете, это cartesian product из «двух таблиц».

Чтобы получить одну строку без дубликатов, вам нужно иметь 1-to-1 relation между обоими tables.


Вы можете увидеть ЗДЕСЬ что такое cartesian joins и ЗДЕСЬ как их избежать!

2 голосов
/ 12 января 2012

Звучит так, как будто вы хотите СОЮЗ доменного имени и диапазон от каждой таблицы - это может быть достигнуто так:

SELECT DYNDOM_DOMAINID, DYNDOM_DSTART, DYNDOM_DEND
FROM DynDom
UNION
SELECT RTRIM(cath_pdbcode), CATH_BEGIN, CATH_END
FROM CATH

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

РЕДАКТИРОВАТЬ: На самом деле, я полагаю, что вы можете получить желаемые результаты, просто изменив условие JOIN ON на ваш взгляд:

FULL OUTER JOIN cath_domains d 
ON d.cath_pdbcode::character(5) = r.pdbcode || r.chainid AND
   r.DomainStart <= d.cathbegin AND
   r.Domain_End >= d.cathend
...