优化连接查询所有左行和连接位指示符

时间:2017-01-09 17:11:13

标签: sql oracle join

所以我有这3张桌子:

T1

T1
--
ID
--
1
2
3
4
5

T2

T2
--
ID
--
1
2
3

T1_2连接(N-N)T1与T2

T1_2
-----------
ID_T1|ID_T2
-----|-----
1    |2
3    |2

我想得到以下结果

EXPECETED RESULT
-----------------
IS_CONNECTED|ID_T1
-----------------
1          |1
0          |2
1          |3
0          |4
0          |5

我来到这里:

SELECT 
  SUM(
    CASE 
      WHEN T1.ID=T1_2.ID_T1 THEN 1
      ELSE 0
    END
  ) IS_CONNECTED,
  T1_2.ID_T1
FROM T1,T1_2
GROUP BY T1_2.ID_T1
;

但它看起来很丑陋,我认为必须有一个更漂亮,更优化的做法。

2 个答案:

答案 0 :(得分:2)

希望这有帮助

select t1.id, decode(id_t1, null, 0,1) IS_CONNECTED 
from t1, t1_2 where t1.id  =id_t1 (+)

答案 1 :(得分:0)

编写此查询的更好方法是:

SELECT T1.ID, COUNT(T2.ID_T1) as IS_CONNECTED,
FROM T1 LEFT JOIN
     T1_2
     ON T1.ID = T1_2.ID_T1
GROUP BY T1.ID;

注意:

  • 这使用正确的ANSI JOIN语法。
  • 这不使用特定于Oracle的DECODE()函数。
  • 相反,它使用COUNT(),它更易于编写且更易于理解。