2015-10-26 6 views
1

Я хочу показать кредиты, которые позаимствованы как минимум. Это случай, когда два кредита привязаны к наименьшему числу заемщиков.Выберите несколько минимальных значений

Loan: 
no | type  
------------ 
L1 | house 
L2 | student 
L3 | car  

Borrower ('num' is foreign key to 'no'): 
name | num 
---------- 
A | L1 
A | L1 
A | L2 
A | L3 

SELECT loan.type 
FROM loan, borrower 
WHERE loan.no = b.num 
    AND loan.type = (SELECT MIN(type) from loan) 
    GROUP BY loan.type 

Это должно производить student и car, но сейчас это просто дает мне один из них. Как мне изменить свой запрос, чтобы решить эту проблему?

ответ

3

Вот метод, использующий КТР:

WITH lb as (
     SELECT l.type, COUNT(b.num) as cnt 
     FROM loan l LEFT JOIN 
      borrower b 
      ON l.no = b.num 
     GROUP BY l.type 
    ) 
SELECT lb.type 
FROM lb 
WHERE lb.cnt = (SELECT MIN(lb.cnt) FROM lb); 

Примечания:

  • Если вы хотите типы кредита с наименьшим количеством заемщиков, то вы должны быть сравнение количество, а не тип.
  • LEFT JOIN рассматривает типы кредитов без заемщиков.
  • Вам необходимо изучить правильный явный синтаксис JOIN. Простое правило: Никогда запятой в разделе FROM; всегда используйте явный синтаксис JOIN.
+0

Исправление: типы кредитов с наименьшим количеством заемщиков. Хорошо, я буду смотреть в JOINING. Есть ли способ уменьшить этот код, чтобы он не имел этого гнездования? – maregor

+0

@maregor. , , Вероятно, это самый простой способ написать запрос в SQLite. –