我正在尝试解决sql练习。
这是架构
PC
code int
model varchar(50)
speed smallint
ram smallint
hd real
cd varchar(10)
price money
问题:
找到具有的PC模型对 类似的速度和RAM。结果是, 每个结果对仅显示 一次,即(i,j)但不是(j,i)。
我写了一个查询,但它显示(i,j)和(j,i)。
我的查询:
select t1.model,t2.model,t1.speed,t1.ram from pc t1 , pc t2
where t1.speed = t2.speed and t1.ram = t2.ram and t1.model != t2.model
输出:
model model speed ram
1121 1233 750 128
1232 1233 500 64
1232 1260 500 32
1233 1121 750 128
1233 1232 500 64
1260 1232 500 32
必需的输出:
model model speed ram
1233 1121 750 128
1233 1232 500 64
1260 1232 500 32
那么如何在输出中避免(j,i)?
感谢。
答案 0 :(得分:5)
输出和所需输出之间的差异正是具有t1.model < t2.model
的行。要删除它们,只需添加另一个AND t1.model >= t2.model
即可。但是因为您已经需要t1.model != t2.model
,所以完整的查询是
select t1.model,t2.model,t1.speed,t1.ram
from pc t1 , pc t2
where t1.speed = t2.speed and t1.ram = t2.ram and t1.model > t2.model
答案 1 :(得分:4)
假设code
是唯一的,您可以将对限制为t1.code < t2.code
。
答案 2 :(得分:2)
SELECT distinct als1.model,als2.model,als1.speed,als1.ram FROM PC als1,PC als2 WHERE(als1.speed = als2.speed)AND(als1.ram = als2.ram)AND(als1。模型&GT; als2.model)
这将解决你获得(j,i)的问题。需要一个过滤器以避免二重结果,因此使用最后一个过滤器(als1.model&gt; als2.model),您可以选择是否需要(i,j)或(j,i)。
答案 3 :(得分:2)
SELECT DISTINCT t.model, l.model, t.speed, t.ram
FROM PC as t JOIN PC as l
ON t.speed = l.speed AND t.ram = l.ram
AND t.model>l.model
这应该在当前和辅助数据库上获得正确的解决方案
答案 4 :(得分:1)
select pc1.model,pc2.model,pc1.speed,pc1.ram
from pc pc1,pc pc2
where pc1.speed=pc2.speed and pc1.ram= pc2.ram
group by pc1.model, pc2.model, pc1.speed, pc1.ram
having pc1.model> pc2.model
答案 5 :(得分:1)
以下代码运行良好,因为我们需要返回模型列两次并获取速度和ram数据并确保我们限制模型数据不重复,我们需要添加条件t1.model > t2.model
:
SELECT t1.model,
t2.model,
t1.speed,
t1.ram
FROM pc t1,
pc t2
WHERE t1.speed = t2.speed
AND t1.ram= t2.ram
GROUP BY t1.model,
t2.model,
t1.speed,
t1.ram
HAVING t1.model > t2.model