【问题标题】:Outer Join multible tables keeping all rows in common colums外部联接多个表,将所有行保留在公共列中
【发布时间】:2017-12-13 08:43:06
【问题描述】:

我对 SQL 很陌生 - 希望您能提供帮助:

我有几张表,它们都有 3 列共有:ObjNoDate(year-month)Product。 每个表还有 1 列,代表经济价值(salescountnetsalesplan ..)

我需要加入 3 个常见列上的所有表格。对于 3 个公共列的每个现有组合,结果必须有一行。并非所有组合都存在于每个表中。

如果我进行完全外连接,我会为每个表获得@9​​87654328@、Date 等,但只需要它们一次。

我怎样才能做到这一点?

+--------------+-------+--------+---------+-----------+
|   tblCount   |       |        |         |           |
+--------------+-------+--------+---------+-----------+
|              | ObjNo | Date   | Product | count     |
|              | 1     | 201601 | Snacks  | 22        |
|              | 2     | 201602 | Coffee  | 23        |
|              | 4     | 201605 | Tea     | 30        |
|              |       |        |         |           |
| tblSalesPlan |       |        |         |           |
|              | ObjNo | Date   | Product | salesplan |
|              | 1     | 201601 | Beer    | 2000      |
|              | 2     | 201602 | Sancks  | 2000      |
|              | 5     | 201605 | Tea     | 2000      |
|              |       |        |         |           |
|              |       |        |         |           |
| tblSales     |       |        |         |           |
|              | ObjNo | Date   | Product | Sales     |
|              | 1     | 201601 | Beer    | 1000      |
|              | 2     | 201602 | Coffee  | 2000      |
|              | 3     | 201603 | Tea     | 3000      |
+--------------+-------+--------+---------+-----------+

谢谢 德文郡

【问题讨论】:

  • 添加一些示例表数据和预期结果 - 作为格式化文本,而不是图像。同时向我们展示您当前的查询尝试。
  • tblCount ObjNo Date Product count 1 201601 Snacks 22 2 201602 Coffee 23 4 201605 Tee 30 tblSalesPlan ObjNo Date Product salesplan 1 201601 Beer 2000 2 201602 Sancks 2000 5 201605 Tee 2000 tblSales ObjNo Date Product Sales 1 201601 Beer 1000 2 201602 Coffee 2000 3 201603 Tee 3000

标签: sql tsql


【解决方案1】:

听起来您正在使用SELECT * FROM...,它为您提供每个表中的每个字段。您可能只想从一个表中获取值,因此您应该明确说明要在结果中包含哪些字段。

如果您不确定每个情况下哪个表会有记录(即不保证在任何特定表中都有记录),您可以使用COALESCE 函数获取第一个非空值每种情况下的价值。

SELECT COALESCE(tbl1.ObjNo, tbl2.ObjNo, tbl3.ObjNo) AS ObjNo, ....
    tbl1.Sales, tbl2.Count, tbl3.Netsales

【讨论】:

  • 谢谢——正是我所需要的。我需要所有表中的所有不常见字段。
  • 是的,您需要根据答案中的示例明确列出 SELECT 字段列表中的每个不常见字段。没有快捷方式可以返回不常见的字段,而无需多次提供所有常见字段。
  • 这与不常见的领域无关——我需要它们。它关于常见的。这里我现在使用 COALESCE
猜你喜欢
  • 2020-11-21
  • 1970-01-01
  • 2013-07-06
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2021-10-06
相关资源
最近更新 更多