SQL子查询替代INTERSECT

时间:2012-01-23 16:26:21

标签: sql ms-access subquery intersect

我有两张桌子: PPC(主列/详细信息由列ID加入)

Table P:
Id integer
Name varchar(12)

Table PC:
Id   integer
Code varchar(12)
Val  number

我希望从P中获得满足以下同时条件的所有名称:

  • 拥有PC.Code='A'Val>100

  • 的电脑
  • 有另一台电脑PC.Code='B'Val>80

总之,我只对那些细节符合这两个条件的P.Name感兴趣。有没有办法选择而不诉诸INTERSECT?

INTERSECT查询是:

Select P.Name 
  from P, PC
 where P.Id=PC.Id
   and PC.Code='A' and Val>100
INTERSECT
Select P.Name 
  from P, PC
 where P.Id=PC.Id
   and PC.Code='B' and Val>80

(兴趣是检查性能并允许查询在Access中运行)

5 个答案:

答案 0 :(得分:1)

不知道表现如何......试试吧..

SELECT P.Name 
  FROM P
  INNER JOIN PC AS a ON P.Id=a.Id and a.Cod='A' and a.Val>100
  INNER JOIN PC AS b ON P.Id=b.Id and a.Cod='B' and a.Val>80

答案 1 :(得分:0)

SELECT P.Name
  FROM P
  JOIN PC AS P1 ON P.Id = P1.Id AND P1.Cod = 'A' AND P1.Val > 100
  JOIN PC AS P2 ON P.Id = P2.Id AND P2.Cod = 'B' AND P2.Val >  80

使用表别名P1和P2可以进行3向连接。但这不是一个自我加入;不是这次。

答案 2 :(得分:0)

Select p.Name
from P p
inner join PC pc1 on p.Id = pc1.Id and pc1.Cod = 'A' and pc1.Val > 100
inner join PC pc2 on p.Id = pc2.Id and pc2.Cod = 'B' and pc2.Val > 80

答案 3 :(得分:0)

Select P.Name 
  from P, PC
 where P.Id=PC.Id
   and PC.Cod='A' and Val>100
   and exists (Select 1 From PC Where Id = P.Id and Cod = 'B' and Val > 80)

答案 4 :(得分:0)

实际上不会使用它,而是替代......

SELECT P.Name
FROM   P
       JOIN PC
         ON P.Id = PC.Id
WHERE  PC.Cod IN ( 'A', 'B' )
       AND Val > 80
GROUP  BY P.Id,
          P.Name
 HAVING MAX(CASE WHEN PC.Cod='A' and Val>100 THEN 1 END) = 1 
 AND MAX(CASE WHEN PC.Cod='B' and Val>80 THEN 1 END) = 1 

或者对于Microsoft Access,having子句需要

 HAVING MAX(IIf(PC.Cod='A' and Val>100, 1, 0)) = 1 
 AND MAX(IIf(PC.Cod='B' and Val>80, 1, 0)) = 1