在SQL中使用两个DISTINCT语句

时间:2012-01-12 13:18:56

标签: sql postgresql select distinct-values

我将两个不同的表组合在一起,一个名为DynDom,另一个名为CATH。我试图从该表中删除重复项,如下所示: enter image description here

但是,如果我从表中选择不同的Dyndom pdbcode,它将返回该pdbcode的不同值。 DynDom table

CATH

基于上面的图片,我注释掉了表中的DynDom / CATH列,并分别为DynDom / CATH运行了查询,并相应地返回了这些值,这就是我需要的,我想知道我是否有可能使用2个不同的语句根据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;

2 个答案:

答案 0 :(得分:3)

你得到的是'两个表'的cartesian product

为了获得一行没有重复项,您需要在1-to-1 relation之间设置tables


您可以看到HERE cartesian joinsHERE如何避免它们!{/ p>

答案 1 :(得分: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