下面的SQL查询是否高效?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了下面的SQL查询是否高效?相关的知识,希望对你有一定的参考价值。

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是捕食者的ID)。

pId aId
-------
1   2
1   3
1   4
2   1
2   2
2   3
2   4
3   1
3   2
3   4
答案

嗯......。我会使用聚合。

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

这里 是一个db<>提琴。

另一答案

从戈登提供的小支线。 由于他的查询是明确地排除了自我通过援助<>pid,这是让#2被包括在列表中。 我会在那些DO吃自己的人身上再加一个LEFT JOIN,并确保其不是其中一个

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);

以上是关于下面的SQL查询是否高效?的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft SQL Server 代码片段收集

有人知道下面的代码片段是啥意思吗?

怎么把下面的的sql语句查询出来的结果插入到一张新表中去 求大神帮忙

sql [SQL查询片段]用于在命令行或通过R和其他工具使用SQL的快速代码段#tags:sql,R,text processing,命令li

基于日期时间值的相同表上的高效sql子查询

SQL语句数据库优化