我将两个不同的表组合在一起,一个名为DynDom,另一个名为CATH。我试图从该表中删除重复项,如下所示:
但是,如果我从表中选择不同的Dyndom pdbcode,它将返回该pdbcode的不同值。 和
基于上面的图片,我注释掉了表中的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;
答案 0 :(得分:3)
你得到的是'两个表'的cartesian product
。
为了获得一行没有重复项,您需要在1-to-1 relation
之间设置tables
。
答案 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