【问题标题】:Use two DISTINCT statements in SQL在 SQL 中使用两个 DISTINCT 语句
【发布时间】:2012-02-08 18:41:43
【问题描述】:

我将两张不同的表组合在一起,一张名为 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;

【问题讨论】:

    标签: sql postgresql select distinct-values


    【解决方案1】:

    听起来好像您想要每个表中的域名和范围的 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
    

    【讨论】:

    • 嗯,它有点工作,但由于它是一个联合,它会在单个列中返回所有匹配的 pdbcode。我不想要那个。这就是我在我的问题中用最后两张图片解释的内容,我实际上想在不使用联合声明的情况下将它们连接在一起。这是我被困在的地方,我不知道该怎么做。请指教。
    • @jeiman90:您的最后两张照片显示了您已经取得的成就,而不是您正在尝试做的事情。请你能澄清你真正想要什么吗?到目前为止,您只列出了您不想想做的事情。
    • 抱歉,基本上从我在问题顶部发布的第一张图片开始,我想从 DYNDOM_DSTART and DYNDOM_DENDCATH_BEGIN, CATH_END 列中删除重复值。我尝试了很多方法,但它们似乎没有有效地工作。我已经用我创建的 VIEW 表更新了我的问题。
    • @jeiman90 - 我认为您的视图查询非常接近您的实际需要 - 请参阅我的修改后的答案,以了解可能满足您要求的 JOIN 条件的更改。
    • @jeiman90:我从提供的数据中推断出cath_domains.cath_pdbcode 是一个由pdbcode 组成的复合字段,然后是chainid,然后是@987654328 上没有的两位数字@,因此需要在 dyndom_domain_table 的两个字段的组合上连接两个表。我还推断cath_domainscathbegincathend 值需要完全在dyndom_domain_table 的域范围值内。如果这些推论中的任何一个不正确,则需要相应地修改连接条件。
    【解决方案2】:

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

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


    你可以看看HERE是什么cartesian joinsHERE如何避免它们!

    【讨论】:

    • 我如何在表格之间建立一对一的关系。而且,顶部的第一个表是一个 VIEW 表,其中我将两个表组合在一起。因此,我做了两个单独的 DISTINCT 语句来选择部分列。
    • @jeiman90 您需要一个表中的列与另一个表中的列相关。请参阅我发布的第二个示例。
    • 是的,我愿意。 pdb 代码。这是我创建的视图表的代码:SELECT DISTINCT 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 r.domainid, r.DomainStart, r.Domain_End, r.pdbcode, d.cath_pdbcode, d.cathbegin, d.cathbegin
    • 如果你愿意,我可以用我创建的视图表更新我的问题,因为它在评论部分看起来很不整齐。
    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多