Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何仅选择第二个表中的行?_Sql_Sql Server - Fatal编程技术网

Sql 如何仅选择第二个表中的行?

Sql 如何仅选择第二个表中的行?,sql,sql-server,Sql,Sql Server,我有一个ID为的表: --FIRST TABLE-- | IDCLIENT | DATE | 112102 2013-10-11 下表将始终具有第一个表的ID --SECOND TABLE-- | IDCLIENT | VALUE | OTHERCOLUMNS 112102 50 112103 30 --THIRD TABLE-- | IDCLIENT | VALUE | OTHERCOLUMNS 112102 10 但另一

我有一个ID为的表:

--FIRST TABLE--
| IDCLIENT |    DATE    |
   112102    2013-10-11
下表将始终具有第一个表的ID

--SECOND TABLE--
| IDCLIENT | VALUE | OTHERCOLUMNS
   112102     50
   112103     30
--THIRD TABLE--
| IDCLIENT | VALUE | OTHERCOLUMNS
   112102     10
但另一个表可能没有第一个表的ID

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

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

更新


我想求和()值列上的值。

我假设您在“如果ID正好在第二个表上,我想选择该行。如果ID在两个表中,我想只选择第二个表上的行”上有一个输入错误。这意味着您希望始终从第二个表中选择,而从不从第三个表中选择

因此,如果有匹配的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
我想对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

听起来你需要在那里左转


请仔细阅读

我认为您需要使用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

您能提供您尝试过的查询吗?对于我来说,不清楚您有多少个表,以及哪一个是第一个表、第二个表和第三个表。“如果ID正好位于第二个表上,我希望选择该行。如果ID位于两个表中,我希望仅选择第二个表上的行。”这是否意味着在这两种情况下都要从第二个表中选择行?如果ID正好位于第二个表中,则我要选择该行。如果ID在两个表中,我只想选择第二个表中的行->这不一样吗?那么您想从第三个表中选择“从不”?我不知道我可以在CASE语句中生成SUM()。嗯,当我尝试您的解决方案时,我得到了一个错误:“无法对包含聚合或子查询的表达式执行聚合函数。”但我将继续跟踪您。谢谢。@erickalves05:然后使用子查询,相应地编辑我的答案。刚刚更改为完全连接,一切都很好。非常感谢。此查询返回错误的结果:(应为10+20+40)。