一尘不染

如何只列出每对元组一次,而不管SQL和关系代数中的列顺序如何?

sql

我正在做一些书本练习,找不到关于如何在关系代数中表达以下内容的解释。虽然我确实找到了SQL的答案,但我对是否有其他解决方案感兴趣。

书中的问题是: 查找具有相同速度和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和模型1的速度和内存,PC1的速度和内存。
  3. 在模型!= model1的条件下,PC和PC1的上述投影之间的Theta连接。
  4. 根据(3)中的结果投影模型和model1。

因此,在SQL查询和关系代数中,匹配结果将被列出两次,但顺序相反。我如何使其仅被列出一次,而与顺序无关?


阅读 243

收藏
2021-03-08

共1个答案

一尘不染

只需使用if 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;
2021-03-08