【问题标题】:How to select records from two tables, COALESCE Values that do not exist in Table1如何从两个表中选择记录,COALESCE 表1中不存在的值
【发布时间】:2019-04-11 18:54:35
【问题描述】:

我有两个包含以下数据的表:

table1 (palletid, caseshipped, orderid)

palletid   |  (caseshipped)  | orderid
2002057    |    10.00        |  146
2002058    |    50.00        |  146
2002059    |    25.00        |  146
2002058    |    10.00        |  142 

table2 (palletid,caseshipping, orderid)

palletid   |  (caseshipping)  |  orderid
2002055    |    0.00          |    146
2002056    |    25.00         |    146
2002057    |    10.00         |    146
2002058    |    50.00         |    146
2002059    |    25.00         |    146
2002060    |    75.00         |    146
2002058    |    10.00         |    142

查询tableresult(DISTINCT(table2.palletid),COALESCE(table1.caseshipped,0), orderid的预期结果

palletid   |  (caseshipped)  | orderid
2002055    |    0.00         |  146
2002056    |    0.00         |  146
2002057    |    10.00        |  146 
2002058    |    50.00        |  146
2002059    |    25.00        |  146
2002060    |    0.00         |  146

我有以下查询,但我得到一个重复的table2.palletid 错误的table1.caseshipped 和错误的table2.orderid

SELECT DISTINCT table2.palletid, 
COALESCE(table1.caseshipped,0) FROM table2
LEFT JOIN table1 ON table2.palletid=table1.PalletID
WHERE table2.orderid = 146

查询结果:

palletid   |  (caseshipped) | orderid
2002055    |    0.00        |   146
2002056    |    0.00        |   146
2002057    |    10.00       |   146
2002058    |    10.00       |   146       Value should not appear(orderid=142)
2002058    |    50.00       |   146       
2002059    |    25.00       |   146
2002060    |    0.00        |   146

如何更正查询以获得预期结果?为什么我得到重复的结果?

我四处寻找类似的问题,但没有找到这个具体情况,但如果有人问过,请直接将我重定向到帖子。

【问题讨论】:

  • 输入值是什么..?
  • 您的任何一个表(table1 或 table2)都有 2 条记录,palletid=2002058。这会导致您的结果中有多个记录。如果有多条记录,那么您想在结果中保留哪条记录?
  • 我在您的表定义中没有看到名为 table1.CaseCount 的列。
  • Table1 的 PalletID 2002058 值重复
  • 对于您发布的示例数据,您的查询不会产生重复值。所以你没有正确描述问题。

标签: sql sql-server sql-server-2016


【解决方案1】:

您只是在ON 子句中缺少一个条件..

SELECT DISTINCT table2.palletid, 
COALESCE(table1.caseshipped,0) FROM table2
LEFT JOIN table1 ON table2.orderID = table1.orderID AND table2.palletid=table1.PalletID
WHERE table2.orderid = 146

【讨论】:

    【解决方案2】:

    您的结果中没有重复结果。在 SQL 中,distinct 子句适用于一行中的每个值,而不是单个列值

    如果您只想要列的每个值的结果,则必须使用 group by 和聚合函数,例如 min() 或 max()

    SELECT  table2.palletid, 
    max(COALESCE(table1.CaseCount,0)) 
    FROM table2
    LEFT JOIN table1 ON table2.palletid=table1.PalletID
    GROUP BY table2.palletid
    

    查看您的最后一个样本,您似乎正在寻找 min () 组 by palleid of the union of the 2 tables

    selet  palletid,  min(caseshipped), orderid
    from(
      select  palletid,  caseshipped, orderid
      from table1
      union  
      select  palletid,  caseshipped, orderid
      from table1
    ) t  
    where orderid = 145 
    group by palletid 
    

    【讨论】:

    • 对不起,我刚刚更正了预期的结果。重复的结果是palletid= 2002058
    • 根据您的示例,我的答案应该会看到您的预期结果,并且对于 paletteid= 2002058 应该选择具有 50.00 的行
    • 是的,在这种情况下是的,但是如果 table1 中的金额为 8.00,例如,当我使用您的代码时,我在 paletteid=2002058 中得到了 10.00 的值,所以在这里做什么
    • 那么你的问题和你的样本不清楚..你最后的评论与你的问题不一致..
    • 我更正了数据样本,并在两个表中添加了另一列,如果现在清楚请告诉我
    【解决方案3】:

    只需在 orderid 上添加连接条件。您在palletid 上的连接导致多对多连接,这就是为什么您看到2 行,它们实际上是4 行(2 用于orderid 146,2 用于orderid 142)但是由于您在orderid 146 上有过滤器,所以您只看到2 行.试试这个:

    SELECT DISTINCT table2.palletid,
    COALESCE(table1.caseshipped,0), table2.orderid FROM table2
    LEFT JOIN table1 
      ON table2.palletid=table1.PalletID
      AND table2.orderid = table1.orderid
    WHERE table2.orderid = 146
    

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 2019-03-22
      相关资源
      最近更新 更多