没有重复的选择。相同的数据,但顺序不同

时间:2019-03-04 11:32:37

标签: sql

我有一些查询返回此值:

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

我不需要重复数据,例如:

1121    1233    750 128
1233    1121    750 128

相同,但模型顺序不同。

所有数据存储在一个表中。有很多具有不同型号的PC。我需要具有相同速度和内存的PC,但是存在一些问题(如上所述)。 这是我的查询:

SELECT a.model, b.model, a.speed, a.ram
FROM PC AS a, PC AS b
WHERE a.speed = b.speed AND a.ram = b.ram AND a.model != b.model
ORDER BY a.model DESC, b.model ASC

4 个答案:

答案 0 :(得分:3)

在现有查询中,将a.model != b.model更改为a.model > b.model将为您提供所需的输出。

SELECT a.model, b.model, a.speed, a.ram FROM PC AS a, PC AS b
WHERE a.speed = b.speed AND a.ram = b.ram 
and a.model > b.model
ORDER BY a.model DESC, b.model ASC

建议对查询使用显式JOIN

您可以按以下方式更改查询。

SELECT a.model, b.model, a.speed, a.ram 
FROM PC AS a
inner join  PC AS b on a.speed = b.speed and a.ram = b.ram and  a.model > b.model      
ORDER BY a.model DESC, b.model ASC

答案 1 :(得分:3)

最简单的方法是将查询更改为使用<

SELECT a.model, b.model, a.speed, a.ram
FROM PC a JOIN
     PC b
     ON a.speed = b.speed AND a.ram = b.ram AND
        a.model < b.model
ORDER BY a.model DESC, b.model ASC;

请注意,这还会修复您的FROM子句,以使用正确的,明确的标准 JOIN语法。

答案 2 :(得分:0)

我不确定您是否对型号真正感兴趣。
如果没有,您可以尝试以下方法:

SELECT   speed,
         ram,
         COUNT(*)   AS number_models,
         MIN(model) AS min_model,
         MAX(model) AS max_model
FROM     pc
GROUP BY speed,
         ram
ORDER BY speed,
         ram;

答案 3 :(得分:0)

如果您以{em> DBMS 的身份使用OraclePostGresMySQL,则更喜欢使用leastgreatest可以与分组一起使用,如下所示

select distinct least(model1,model2) as model1,
       greatest(model1,model2) as model2,
       speed, ram
  from pc
 group by greatest(model1,model2), least(model1,model2), speed, ram;

model1  model2  speed   ram
1121    1233    750     128
1232    1233    500     64
1232    1260    500     32