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

new9mtju  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(3)|浏览(105)

我正在做一些书本练习,找不到关于如何用关系代数来表达下面的问题的解释,我确实找到了一个answer for SQL though,但我对是否有替代方法来解决它很感兴趣。
书中的问题是:* 找出具有相同速度和内存的电脑型号对。一对电脑只应列出一次;例如列表(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

关系代数表达式I根据以下公式构建:
1.定义名为PC1的PC副本,并将属性"model"重命名为"model1"。
1.投影PC的型号、速度和内存以及PC1的型号1、速度和内存。
1.θ连接PC和PC1的上述投影,条件是model1 = model1。
1.从(3)中的结果投影模型和模型1。
因此,在SQL查询和关系代数中,匹配结果都将以相反的顺序列出两次,我如何使它只列出一次而不考虑顺序呢?

i7uaboj4

i7uaboj41#

只要使用如果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;
qnyhuwrf

qnyhuwrf2#

以下是一个选项:

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;
of1yzvn4

of1yzvn43#

对你得到的关系进行自连接,并连接那些相似的关系,例如1,2和2,1项目的第一列

相关问题