Лучший способ вернуть '1', если левое соединение возвращает какие-либо строки - PullRequest
6 голосов
/ 07 июля 2010

У меня есть три таблицы: «А», «В» и «С». У меня есть запрос на '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;

Это кажется немного неэффективным, потому что я должен перечислить все эти поля в GROUP BY, а также потому, что я рассчитываю, где все, что я действительно хочу, это то, есть ли хотя бы одно совпадение или нет. Можно ли это улучшить?

1 Ответ

13 голосов
/ 07 июля 2010

использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...