寻找PC模型对

时间:2011-05-19 13:25:18

标签: sql sql-server-2005

我正在尝试解决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)?

感谢。

6 个答案:

答案 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