【问题标题】:SQL How to join two query's with different columns and joinsSQL如何连接具有不同列和连接的两个查询
【发布时间】:2018-12-18 02:59:09
【问题描述】:

我有 2 个查询都使用连接,从多个表中选择不同的列,产生以下结果集:

companyID   workType    contractnumber  employeenumber  Value2
1           1C          9999999         111111          2547.21
1           1C          9999999         222222          863.67
1           1C          9999999         333333          2962.15
1           1C          9999999         444444          1971.61
1           1C          9999999         555555          152.41
1           1C          9999999         666666          155.90
1           1C          9999999         777777          657.20


companyID   normalWorkType  employeeNumber  value1
1           1C              11111           1016.08
1           1C              22222           3118.05
1           1C              33333           2628.81
1           61              44444           2547.21

我希望加入这些以产生以下结果.. 谁能解释正确的语法是什么?

companyID   normalWorkType  contractnumber  employeeNumber  value1  Value2
1           1C              9999999         11111           1016.08 2547.21
1           1C              9999999         22222           3118.05 863.67
1           1C              9999999         33333           2628.81 2962.15
1           61              9999999         44444           2547.21 1971.61
1           1C              9999999         55555           0       152.41
1           1C              9999999         66666           0       155.90
1           1C              9999999         77777           0       657.20

上面的分组是在 companyID 和employeeNumber 上

【问题讨论】:

  • 加入 a.companyid = b.companyid 和 a.worktype = b.normalworktype 和 a.employeenumber = b.employeenumber?
  • 你有什么尝试吗?

标签: sql sql-server sql-server-2005


【解决方案1】:

试试下面的查询

select Table1.companyId,Table2.normalworktype,Table1.contractnumber,
Table1.employeenumber,Table2.value1,Table1.value2 
from Table1 
inner join Table2 on Table1.companyid = Table2.companyid 
      and Table1.employeeNumber=Table2.employeeNumber

【讨论】:

    【解决方案2】:

    尝试左外连接:

    SELECT t1.companyID,
           t2.normalWorkType,
           t1.contractnumber,
           t1.employeeNumber,
           coalesce(t2.value1,0) as t2.value1,
           t1.value2
    FROM DatabaseName.t1 AS t1 LEFT OUTER JOIN
         DatabaseName.t2 AS t2 ON t1.employeenumber = t2.employeenumber  
           AND t1.companyID = t2.companyID
    

    【讨论】:

      【解决方案3】:

      您可以将搜索结果放入 2 个临时表,然后加入这 2 个临时表,或者为您的每个选择使用联盟,然后加入它们。 喜欢:

      SELECT 
        *
      FROM (
        SELECT 
           companyID
          ,workType
          ,contractnumber
          ,employeenumber
          ,Value2
        FROM table1
        ) t1
      INNER JOIN (
        SELECT 
           companyID
          ,normalWorkType
          ,contractnumber
          ,employeeNumber
          ,value1
          ,Value2
        FROM table2
        ) t2 
          ON t1.companyID = t2.companyid
      

      或将您的结果放入 2 个不同的临时表,然后加入它们

      SELECT 
         companyID
        ,workType
        ,contractnumber
        ,employeenumber
        ,Value2
      INTO #tt1
      FROM table1
      
      SELECT 
         companyID
        ,normalWorkType
        ,contractnumber
        ,employeeNumber
        ,value1
        ,Value2
      INTO #tt2
      FROM table2
      
      SELECT *
      FROM #tt1 t1
      INNER JOIN #tt2 t2 ON t1.companyid = t2.companyID
      

      【讨论】:

      • 两个中间结果集的内部连接将被限制在两个集合中匹配的行。这里的 OP 要求进行外部连接。此外,在这里构建临时表只会给操作增加不必要的开销。但是,这是您的两个答案中的内部连接,导致我否决了您的答案。它将返回不正确的结果。
      【解决方案4】:

      我在这里假设建议结果集中的合同编号实际上是您第一个查询中的合同编号,并且差异只是一个错字。如果这是真的,这将得到你想要的。

      SELECT
        q1.companyID   
        COALESCE(q2.normalWorkType,q1.workType) AS normalWorkType
        q1.contractnumber  
        q1.employeeNumber  
        COALESCE(q2.value1  ,0) as value1
        q1.Value2
      FROM
        (
          <Your first query>
        ) as q1
      LEFT JOIN
        (
          <Your second query>
        ) as q2
          ON
            q1.companyID = q2.companyID
            AND
            q1.employeeNumber = q2.employeeNumber;
      

      【讨论】:

      • 感谢您的回复 Eric,幸运的是我在看到这个之前从另一个答案中找到了解决方案,但是您确实发现了错字并且您的答案具有相关性。由于这些原因投票赞成。
      【解决方案5】:

      谢谢大家的回复,

      在尝试了 Husam Ebish 的建议之后,这并不是我所需要的,但将我引向了这个线程。 (投票赞成你的答案)

      How to combine two query results into one and I have different column name

      我真正发现有用的是链接线程中突出显示的这一点信息。在尝试了不同的“左”连接后建议评论突出显示引导我尝试“完全外连接”,这给了我正确的结果集。

      如果每个查询只有一行,则它只是一个 CROSS JOIN

      SELECT
        *
      FROM
        (query1)   AS q1
      CROSS JOIN
        (query2)   AS q2
      

      如果每个查询有不止一行,则需要 INNER JOIN 或者可能是 FULL OUTER JOIN 和两组之间的某种关系 数据

      SELECT
        *
      FROM
        (query1)   AS q1
      FULL OUTER JOIN
        (query2)   AS q2
            ON  q2.id2 = q1.id1
      

      注意:

      • UNION 垂直追加数据
      • JOIN 水平追加数据

      【讨论】:

        【解决方案6】:
        SELECT
          *
        FROM
          (select top 1  VL1,VL2,VL3 from current_voltage AS q1
        where deviceimei ='233'
        order by devicetimestamp)   AS q1
        CROSS JOIN
          (select top 1  OTI,WTI,ATI from overview  AS q2
        where deviceimei ='233'
        order by devicetimestamp  )   AS q2
        

        【讨论】:

        • 如果您尝试回答 OP 的问题,您应该在回复中真正使用示例数据,而不是完全不同的东西,因为这可能会使他们感到困惑,例如他们没有名为 current_voltage 的表格跨度>
        • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多