【问题标题】:Taking inner subset result of one join and combining this with an outer join获取一个连接的内部子集结果并将其与外部连接组合
【发布时间】:2021-01-21 05:24:21
【问题描述】:

我想加入三个表,df1、df2 和 df3。我想从 df1/df2 获取结果,然后将其加入 df3。

我想将表格 df1 和 df2 ON 版本和名称与目的条件结合起来 =“嗨”或“猫” 然后我想获取这个子集的结果并将其应用于我的 df1 外连接 df1 会在主机和电脑上加入这个内表

df1

version host    date                                      
pat     a16     12/1/2019   
fam     a16     12/1/2019   
emp     a16     12/1/2019   
dan     a16     12/1/2019 

df2

name    purpose
pat     hi
fam     cat
emp     dog
dan     bird

df3

pc  size    free  date
a16 5       1     12/1/2019
a40 4       3     12/1/2019
a41 3       1     12/1/2019

渴望

version host    date          name    purpose   pc   size    free  date
pat     a16     12/1/2019     pat     hi        a16  5       1     12/1/2019
fam     a16     12/1/2019     fam     cat   
                

正在做

SELECT   SUM(df3.size) AS size, SUM(df.3.free) AS free,
         df3.date
FROM     df3
               (SELECT DISTINCT 
                       df2.purpose, df2.name,
                       df1.version, df1.host
               FROM    df1
               JOIN    df2  ON 
                       df2.name = df1.version
               WHERE   df2.purpose = 'cat' OR df2.purpose = 'hi')
               AS NEW
JOIN     df3 ON 
df3.pc = NEW.host

但是,我的值是双倍的,因为似乎有重复。我还在研究。任何建议表示赞赏。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您的代码中有一些错误,但可能是拼写错误,所以我没有直接指出这些错误,只是修复了它们(因为它们似乎是拼写错误)。

    您还在连接中不需要的地方复制了 df3,这很可能导致您的重复。以下应该可以工作。

    SELECT   SUM(df3.size) AS size, SUM(df3.free) AS free, df3.date
    FROM     df3
    INNER JOIN (
        SELECT DISTINCT df2.purpose, df2.name, df1.version, df1.host
        FROM    df1
        JOIN    df2  ON df2.name = df1.version
        WHERE   df2.purpose = 'cat' OR df2.purpose = 'hi'
    ) AS NEW ON df3.pc = NEW.host
    Group by df3.date
    

    【讨论】:

    • 不需要 GROUP BY?
    • @jarlh 你是对的,我添加了 Group By
    【解决方案2】:

    您可以先使用 df1 和 df2 进行内部连接。然后使用该结果表加入 df3。

    select *
    from df3 join 
      (
       select *
       from df1 join df2 on df1.version = df2.name
      ) df12
    on df3.pc = df12.host
    where df12.purpose = "hi" or df12.purpose = "cat";
    

    进一步解释,内部子查询是:

    
    select *
    from df1 join df2 on df1.version = df2.name
    
    
    | version | host | date_of_purchase | name | purpose |
    |---------|------|------------------|------|---------|
    |     pat |  a16 |       2021-01-20 |  pat |      hi |
    |     fam |  a16 |       2021-01-20 |  fam |     cat |
    |     emp |  a16 |       2021-01-20 |  emp |     dog |
    |     dan |  a16 |       2021-01-20 |  dan |    bird |
    

    然后外部查询结果

    |  pc | size | free | date_of_purchase | version | host | date_of_purchase | name | purpose |
    |-----|------|------|------------------|---------|------|------------------|------|---------|
    | a16 |    5 |    1 |       2021-01-20 |     pat |  a16 |       2021-01-20 |  pat |      hi |
    | a16 |    5 |    1 |       2021-01-20 |     fam |  a16 |       2021-01-20 |  fam |     cat |
    

    这是上述所有内容的小提琴(包括使用您提供的输入创建的表):http://sqlfiddle.com/#!9/32457b/19

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 2011-06-23
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多