【问题标题】:How to select just the row in the second table?如何只选择第二个表中的行?
【发布时间】:2013-10-14 13:32:42
【问题描述】:

我有一个带有 ID 的表:

--FIRST TABLE--
| IDCLIENT |    DATE    |
   112102    2013-10-11

下表将始终具有第一个表的 ID。

--SECOND TABLE--
| IDCLIENT | VALUE | OTHERCOLUMNS
   112102     50
   112103     30

但是这个另一个表可能没有第一个表的 ID。

--THIRD TABLE--
| IDCLIENT | VALUE | OTHERCOLUMNS
   112102     10

如果 ID 只是在第二个表上,我想选择该行。如果 ID 在两个表中,我只想选择第三个表上的行。我怎样才能做到这一点?我尝试使用连接但没有成功。

更新

我想 SUM() VALUE 列上的值。

【问题讨论】:

  • 你能提供你试过的查询吗?
  • 对我来说不清楚你有多少张桌子,第一张、第二张和第三张是哪一张。
  • "如果 ID 仅在第二个表上,我想选择该行。如果 ID 在两个表中,我只想选择第二个表上的行。"这是否意味着您想在两种情况下都从第二个表中选择行?
  • 如果 ID 只是在第二个表上,我想选择该行。如果 ID 在两个表中,我只想选择第二个表上的行 -> 这不一样吗?
  • 所以你想从第三个表中选择从不

标签: sql sql-server


【解决方案1】:

我认为您需要对值使用 case 语句。以下只是我的想法,所以如果这不起作用,您可能需要使用完全连接。

select t1.date, case when t3.IDCLIENT is not NULL then t3.value else t2.value end as Value
from Table1 t1 inner join Table2 t2 on t1.IDCLIENT = t2.IDCLIENT inner join
Table3 t3 on t1.IDCLIENT = t3.IDCLIENT

【讨论】:

  • 刚刚更改为 FULL JOIN,一切正常。非常感谢。
  • 这个查询返回错误的结果:sqlfiddle.com/#!6/1ec35/4/0(应该是10+20+40)。
【解决方案2】:

听起来您需要在那里进行 LEFT JOIN。

阅读它Here

【讨论】:

    【解决方案3】:

    我假设您在 “如果 ID 只是在 second 表上我想选择该行。如果 ID 在两个表中,我只想选择第二个表上的行”。这意味着您要始终从第二个表中选择,而不是从第三个表中选择。

    所以我想如果有匹配的 ID,你想从第三个中选择,否则使用第二个作为“后备”表。

    您可以将EXISTSCASE 一起使用:

    SELECT t1.IDCLIENT,
           CASE WHEN EXISTS(SELECT 1 FROM dbo.Table3 t3 
                           WHERE t3.IDCLIENT = t1.IDCLIENT)
           THEN (SELECT TOP 1 t3.Value FROM dbo.Table3 t3 
                 WHERE t3.IDCLIENT = t1.IDCLIENT)
           ELSE (SELECT TOP 1 t2.Value FROM dbo.Table2 t2
                 WHERE t2.IDCLIENT = t1.IDCLIENT)
           END AS Value
    FROM dbo.Table1 t1
    

    我想 SUM() VALUE 列上的值。

    然后您可以在上面的查询中使用子查询,例如:

    SELECT SUM(X.Value) FROM(
      SELECT t1.IDCLIENT,
             CASE WHEN EXISTS(SELECT 1 FROM dbo.Table3 t3 
                             WHERE t3.IDCLIENT = t1.IDCLIENT)
             THEN (SELECT TOP 1 t3.Value FROM dbo.Table3 t3 
                   WHERE t3.IDCLIENT = t1.IDCLIENT)
             ELSE (SELECT TOP 1 t2.Value FROM dbo.Table2 t2
                   WHERE t2.IDCLIENT = t1.IDCLIENT)
             END AS Value
      FROM dbo.Table1 t1
    ) X
    

    Demo

    【讨论】:

    • 我不知道我可以在 CASE 语句中生成 SUM()。好吧,当我尝试您的解决方案时,我收到了这个错误:“无法对包含聚合或子查询的表达式执行聚合函数。”但我会一直跟踪你。谢谢。
    • @erickalves05:然后使用子查询,相应地编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多