无论SQL和关系代数中的列顺序如何,如何仅列出每对元组一次?

时间:2017-03-08 14:40:06

标签: sql postgresql relational-algebra

我正在进行一些书籍练习,无法找到关于如何在关系代数中表达以下内容的解释。我确实找到了answer for SQL though,但我对是否有任何替代方案感兴趣。

本书的问题是:找到那些具有相同速度和RAM的PC模型。一对应该只列出一次;例如,列表(i,j)但不是(j,i)。

PC的架构是:

PC (
    model INTEGER NOT NULL PRIMARY KEY,
    speed NUMERIC,
    ram INTEGER,
    hd INTEGER,
    price INTEGER);

和我的查询:

SELECT PC.model, PC1.model
FROM PC, PC AS PC1 
WHERE PC.model != PC1.model AND PC.speed = PC1.speed AND PC.ram = PC1.ram;

返回:

 model | model 
-------+-------
  1004 |  1012
  1012 |  1004

根据以下构造的关系代数表达式:

  1. 定义名为PC1的PC副本,其属性“model”重命名为“model1”。
  2. PC和型号的项目型号,速度和冲压力,PC1的速度和冲压力。
  3. Theta在PC和PC1的上述投影之间连接,条件是模型!= model1。
  4. 项目模型和模型1来自(3)中的结果。
  5. 因此,在SQL查询和关系代数中,匹配结果将按两个相反的顺序列出。无论订单如何,我如何只列出一次?

2 个答案:

答案 0 :(得分:4)

只要使用PC.model != PC1.model,那么一个比另一个小。因此,如果您需要其中一对,请使用PC.model < PC1.modelPC.model > PC1.model(取决于您要保留哪一对)。

SELECT PC.model, PC1.model
FROM   PC, PC AS PC1 
WHERE  PC.model < PC1.model AND PC.speed = PC1.speed AND PC.ram = PC1.ram;

答案 1 :(得分:0)

这是一个选项:

SELECT DISTINCT LEAST(pc1.model, pc2.model),
                GREATEST(pc1.model, pc2.model)
FROM PC pc1
INNER JOIN PC AS pc2
    ON pc1.model <> pc2.model
WHERE pc1.speed = pc2.speed AND
      pc1.ram = pc2.ram;