Эффективен ли следующий SQL запрос? - PullRequest
0 голосов
/ 22 апреля 2020

SQL Проблема запроса: Найти всех животных, которые едят всех животных, кроме себя

Я написал следующий запрос и дал результаты, но я хотел бы знать

Есть ли другой лучший подход?

SQL Запрос -

select * from [dbo].Animal a
where (
(
(select COUNT(distinct id) from [dbo].Animal b
where  b.id <> a.id)
=
(select COUNT(*) from [dbo].Food
where  pId = a.id and aId <> a.id)
) 
AND
(select COUNT(*) from [dbo].Food
where  pId = a.id and aId = a.id) = 0
)

Таблица животных

id  name
--------
1   Ant
2   Bear
3   Cat
4   Dog

Таблица продуктов питания (здесь pId is predatorId)

pId aId
-------
1   2
1   3
1   4
2   1
2   2
2   3
2   4
3   1
3   2
3   4

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Небольшой побочный доход от того, что предложил Гордон. Так как его запрос явно исключал себя через помощи <> pid, это позволило # 2 быть включенным в список. Я хотел бы добавить еще одну левую комбинацию на тех, которые едят сами и убедитесь, что это не один из тех,

select 
      f.pid
   from 
      food f
         -- this is looking for the current predator
         -- in the food table and it allows itself to eat itself
         LEFT JOIN food f2
            on f.pid = f2.pid
           AND f2.pid = f2.aid

   where 
          f.aid <> f.pid
      -- and it is NOT a cannibalistic animal, 
      -- hence we do NOT want to find in the left join of F2
      AND f2.pid is NULL
   group by 
      f.pid
   having 
      count(*) = (select count(*) - 1 from animal);
0 голосов
/ 22 апреля 2020

Хммм. , , Я бы использовал агрегацию:

select pid
from food
group by pid
having count(*) = (select count(*) - 1 from animal) and
       sum(case when aid = pid then 1 else 0 end) = 0

Здесь - это дБ <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...