SQL Union所有显示重复记录

时间:2014-07-31 06:19:42

标签: sql union-all

我使用Union All和Left join功能连接3个表,但显示重复记录。

表1

Worksheet No           Employee code
001                         A
001                         B
001                         C
002                         D
002                         E

表2

Worksheet No             Quantity
001                         10
002                         20

表3

Worksheet No           Employee code      Payslip No      Date         Salary
001                         A              P001           1/1/14        300
001                         B              P002           1/1/14        700
001                         C              P003           1/1/14        200
002                         D              P004           2/2/14        1000
002                         E              P005           2/2/14        800

输出应该是

Worksheet No           Employee code      Payslip No      Date       Quantity    Salary
001                         A              P001           1/1/14         10        300
001                         B              P002           1/1/14         10        700
001                         C              P003           1/1/14         10        200
002                         D              P004           2/2/14         20        1000
002                         E              P005           2/2/14         20        800

但它会显示重复的记录,这不是我想要的

Worksheet No           Employee code      Payslip No      Date       Quantity    Salary
001                         A              P001           1/1/14         10        300
001                         A              P002           1/1/14         10        700
001                         A              P003           1/1/14         10        200
001                         B              P001           1/1/14         10        300
001                         B              P002           1/1/14         10        700
001                         B              P003           1/1/14         10        200
001                         C              P001           1/1/14         10        300
001                         C              P002           1/1/14         10        700
001                         C              P003           1/1/14         10        200
002                         D              P004           2/2/14         20        1000
002                         D              P005           2/2/14         20        800
002                         E              P004           2/2/14         20        1000
002                         E              P005           2/2/14         20        800 

这是我的查询

SELECT 
    tlb2.Worksheet_No, tlb2.Quantity,
    null, null,null,null
FROM Table2 tbl2
LEFT OUTER JOIN Table1 tbl1 on (tbl1.Worksheet_No = tbl2.Worksheet_No) 
UNION ALL
SELECT
     null,null,
     tbl3.Employee_Code,tbl3.Payslip_No,tbl3.Date,tbl3.Salary
FROM Talbe3 tlb3
LEFT OUTER JOIN Table1 tbl1 on (tbl1.Employee_Code = tbl3.Employee_Code)

任何人都可以找出问题所在吗? 谢谢

3 个答案:

答案 0 :(得分:0)

此查询会生成所需输出中列出的结果:

SELECT 
     tbl3.Worksheet_No, 
     tbl3.Employee_Code,
     tbl3.Payslip_No,
     tbl3.Date,
     tbl2.Quantity,
     tbl3.Salary    
FROM Table3 tbl3
JOIN Table2 tbl2 ON (tbl3.Worksheet_No = tbl2.Worksheet_No)

虽然它没有使用UNION - 所述的问题(所需的输出)目前不适合使用UNION连接。如果你要包含一些更多的数据来表明为什么需要UNION(而不是想要?),那么可能需要重写查询。

正如评论中所指出的,似乎有些表格需要进行标准化。也许可以重命名它们以指示每个表的用途,例如EmployeeWorksheet,WorksheetQuantity,Employee。我不太清楚为什么工作表编号包含在Table 3中,当该表中的其他内容似乎与员工有关时。

答案 1 :(得分:0)

尽管您的表格设计和实际查询还有很大的改进空间,但您似乎对 union all union 实际上做了什么有误解。

您可以阅读以下解释:http://www.w3schools.com/sql/sql_union.asp

简而言之:

  • union 仅选择不同行。因此,所有重复项都会自动删除。
  • union all 选择所使用的子查询的所有行。因此,您将获得所有重复项。

答案 2 :(得分:0)

表1似乎没有任何用途,但如果您想将其加入表3,则表明您应该加入工作表而不是员工代码。