-6

我有一个带有 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 列上的值。

4

3 回答 3

0

我认为您需要对值使用 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
于 2013-10-14T13:47:46.890 回答
0

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

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

您可以EXISTS使用CASE

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

于 2013-10-14T13:38:47.890 回答
0

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

在这里阅读

于 2013-10-14T13:38:53.280 回答