SQL如何连接具有不同列和连接的两个查询

SQL如何连接具有不同列和连接的两个查询,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有两个查询都使用联接,从多个表中选择不同的列,这些表生成以下结果集: companyID workType contractnumber employeenumber Value2 1 1C 9999999 111111 2547.21 1 1C 9999999 222222 863.67 1 1C

我有两个查询都使用联接,从多个表中选择不同的列,这些表生成以下结果集:

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上,请尝试下面的查询

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个临时表,然后加入此2个临时表,或者使用alliance进行每次选择,然后加入它们。 比如:

或者将结果放在两个不同的临时表中,然后加入它们

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

我在这里假设,建议的结果集中的合同号实际上是您第一次查询中的合同号,差异只是一个输入错误。如果这是真的,这会让你得到你想要的

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;

谢谢大家的回复

在尝试了Husam Ebish的建议后,这并不是我所需要的,而是引导我找到了这条线索。我赞成你的答案

我真正发现有用的是下面从链接线程中突出显示的这一点信息。在尝试不同的左连接后,建议注释的突出显示引导我尝试完整的外部连接,这为我提供了正确的结果集

如果每个查询只有一行,那么它只是一个交叉连接

如果每个查询中有多行,则需要一个内部联接 或者可能是一个完整的外部连接和两个集合之间的某种关系 数据量

注:

并集垂直附加数据 JOIN水平附加数据
在a.companyid=b.companyid和a.worktype=b.normalworktype和a.employeenumber=b.employeenumber上进行联接?是否尝试了任何操作?两个临时结果集上的内部联接将限于两个集合中具有匹配项的行。这里的OP请求外部连接。此外,在这里构建临时表只会给操作增加不必要的开销。然而,正是你两个答案中的内在联系让我投票否决了你的答案。它将返回不正确的结果。感谢您的回复Eric,幸运的是,在看到这一点之前,我从另一个答案中找到了一个解决方案,但是您确实发现了拼写错误,并且您的答案具有相关性。由于这些原因,投票率上升。如果您试图回答OP的问题,您应该在回答中使用这些示例数据,而不是完全不同的内容,因为这可能会混淆他们,例如他们没有一个名为current_Voltage的表,而此代码可能会解决问题,如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。
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
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;
SELECT
  *
FROM
  (query1)   AS q1
CROSS JOIN
  (query2)   AS q2
SELECT
  *
FROM
  (query1)   AS q1
FULL OUTER JOIN
  (query2)   AS q2
      ON  q2.id2 = q1.id1
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