我有两张桌子:
P
和PC
(主列/详细信息由列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中运行)
答案 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