2

我将两张不同的表组合在一起,一张名为 DynDom,另一张为 CATH。我正在尝试从该表中删除重复项,如下所示: 在此处输入图像描述

但是,如果我从表中选择不同的 Dyndom pdbcode,它会返回该 pdbcode 的不同值。 动态表

阴极射线管

根据上面的图片,我注释掉了表中的 DynDom/CATH 列,并为 DynDom/CATH 单独运行了查询,并相应地返回了这些值,这是我需要的,我想知道我是否可以使用 2 distinct 语句根据 pdbcode 返回整个表的不同值。

这是我的代码:

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";

最后,我想根据 pdbcode 从 DynDom 和 CATH 中搜索域,并返回没有重复值的行。

谢谢你。

更新 :

这是我完成的 VIEW 表。

    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;
4

2 回答 2

3

你得到的是cartesian product“两张桌子”中的一张。

为了获得没有重复的一行,您必须1-to-1 relation在两者之间有一个tables.


你可以在这里看到是什么cartesian joins以及如何避免它们!

于 2012-01-12T13:25:22.117 回答
2

听起来好像您想要每个表中的域名和范围的 UNION - 这可以像这样实现:

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
于 2012-01-12T13:50:46.693 回答