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

How to list each pair of tuple only once irrespective of column order in SQL and relational algebra?

我正在做一些书本练习,找不到关于如何在关系代数中表达以下内容的解释。我确实找到了 answer for SQL though,但我想知道是否有任何替代方法可以解决它。

书中的问题是:找出那些速度和 RAM 都相同的 PC 型号对。一对应该只列出一次;例如,list(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;

哪个returns:

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

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

  1. 定义一个名为 PC1 的 PC 副本,属性 "model" 重命名为 "model1"。
  2. PC和model1的项目型号,速度和内存,PC1的速度和内存。
  3. Theta 在 PC 和 PC1 的上述投影之间加入,条件是模型 != model1。
  4. 项目模型和模型 1 来自 (3) 中的结果。

因此,在 SQL 查询和关系代数中,匹配结果将以相反的顺序列出两次。如何让它只列出一次而不考虑顺序?

这是一个选项:

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;

只要利用这个事实,如果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;