Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 更好的返回方式';1';如果左连接返回任何行?_Sql_Oracle_Join - Fatal编程技术网

Sql 更好的返回方式';1';如果左连接返回任何行?

Sql 更好的返回方式';1';如果左连接返回任何行?,sql,oracle,join,Sql,Oracle,Join,我有三张桌子,“A”、“B”和“C”。我对“A”和“B”有疑问,但我想添加一个字段,告诉我是否有一个或多个(我不关心有多少个)“C”是外键输入到“A”的 以下是我所拥有的: SELECT A.A_id, A.col_2, col_3, B.col_2, A.col_4 count(C.id) as C_count FROM A JOIN B ON (A.B_id = B.B_id) LEFT JOIN C ON (A.A_id = C.A_id) W

我有三张桌子,“A”、“B”和“C”。我对“A”和“B”有疑问,但我想添加一个字段,告诉我是否有一个或多个(我不关心有多少个)“C”是外键输入到“A”的

以下是我所拥有的:

SELECT    A.A_id, A.col_2, col_3, B.col_2, A.col_4
          count(C.id) as C_count
FROM      A
JOIN      B ON (A.B_id = B.B_id)
LEFT JOIN C ON (A.A_id = C.A_id)
WHERE     A.A_id = ?
GROUP BY  A.A_id, A.col_2, col_3, B.col_2, A.col_4
ORDER BY  CASE WHEN A.col_2 = ?
               THEN 0
               ELSE 1 
          END, col_3;

这似乎有点低效,既因为我必须按列出
分组中的所有字段,也因为我正在计算我真正想要的是是否至少有一个匹配项。这可以改进吗?

使用Exists代替子查询

 Select A.A_id, A.col_2, col_3, 
    B.col_2, A.col_4, 
    Case When Exists (Select * From C
                      Where A_id = A.A_id)
         Then 1 Else 0 End As C_Exists
 From A Join B 
     On (A.B_id = B.B_id) 
 Where A.A_id = ?    
 Order By Case When A.col_2 = ? 
           Then 0 Else 1 End, col_3;

仅仅因为必须键入大量列名,并不会使查询效率低下;)但在这种情况下,你是对的。对计数进行排序和制表的成本很高,但可能更高的成本是数据库必须遍历表C中的所有行才能获得该计数。对于EXISTS解决方案,只要找到第一个匹配行,它就可以停止查找。非常好。解释计划说它也更好。3分钟后我才能接受它。@Paul Tomblin:这是因为一旦找到与条件的第一个成功匹配项,EXISTS将返回true-EXISTS不需要检查所有匹配条件。