连接两个表以获得匹配的记录和不匹配的记录

izj3ouym  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(316)

例如,我有两张table

  1. DECLARE @Employee TABLE(
  2. [EmployeeID] INT NOT NULL,
  3. [FirstName] VARCHAR(250) NOT NULL,
  4. [LastName] VARCHAR(250) NOT NULL,
  5. [Value] INT NOT NULL,
  6. [ExpenditureID] INT NOT NULL
  7. );
  8. DECLARE @Expenditure TABLE(
  9. [ExpenditureID] INT NOT NULL,
  10. [Type] VARCHAR(250) NOT NULL
  11. );
  12. INSERT @Expenditure ([ExpenditureID], [Type])
  13. VALUES (1, N'Salary' ),
  14. (2, N'Bonus')
  15. INSERT @Employee([EmployeeID], [FirstName], [LastName], [Value], [ExpenditureID])
  16. VALUES (1, N'Orlando', N'Gee', 1500, 1 ),
  17. (2, N'Keith', N'Harris', 1000, 1),
  18. (3, N'Keith', N'Harris', 700, 2),
  19. (4, N'Donna', N'Carreras',2000, 1 ),
  20. (5, N'Janet', N'Gates', 900, 1 )

我想得到这样的结果

  1. FirstName | LastName | Value | Type
  2. -----------------------------------
  3. Orlando Gee 0 Bonus
  4. Orlando Gee 1500 Salary
  5. Keith Harris 700 Bonus
  6. Keith Harris 1000 Salary
  7. Donna Carreras 0 Bonus
  8. Donna Carreras 2000 Salary
  9. Janet Gates 0 Bonus
  10. Janet Gates 900 Salary

我编写了返回相同结果的查询

  1. SELECT p.FirstName, p.LastName, SUM(p.Value) AS Value, p.Type FROM (
  2. SELECT emp.EmployeeID, emp.FirstName, emp.LastName, emp.Value, exp.Type FROM @Employee AS emp
  3. INNER JOIN @Expenditure AS exp ON exp.ExpenditureID = emp.ExpenditureID
  4. UNION ALL
  5. SELECT emp.EmployeeID, emp.FirstName, emp.LastName, 0, exp.Type FROM @Employee AS emp
  6. CROSS JOIN @Expenditure AS exp
  7. WHERE exp.ExpenditureID <> emp.ExpenditureID
  8. ) AS p
  9. GROUP BY p.FirstName, p.LastName, p.Type

但我不喜欢这样。有没有其他更有效的解决方案?

vecaoik1

vecaoik11#

使用 cross join 生成行和 left join 引入价值观:

  1. select n.*, e.type, coalesce(em.value, 0) as value
  2. from (select distinct firstname, lastname from employee) n cross join
  3. expenditure e left join
  4. employee em
  5. on em.firstname = n.firstname and em.lastname = n.lastname and
  6. em.ExpenditureID = e.ExpenditureID;

聚合似乎不是必需的,但如果您有多个需要求和的行,则可能是必需的。您的示例数据没有此类示例。
这是一把小提琴。

相关问题