如何只列出每对元组一次,而不考虑 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
我根据以下构造的关系代数表达式:
- 定义一个名为 PC1 的 PC 副本,属性 "model" 重命名为 "model1"。
- PC和model1的项目型号,速度和内存,PC1的速度和内存。
- Theta 在 PC 和 PC1 的上述投影之间加入,条件是模型 != model1。
- 项目模型和模型 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.model
或 PC.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;
我正在做一些书本练习,找不到关于如何在关系代数中表达以下内容的解释。我确实找到了 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
我根据以下构造的关系代数表达式:
- 定义一个名为 PC1 的 PC 副本,属性 "model" 重命名为 "model1"。
- PC和model1的项目型号,速度和内存,PC1的速度和内存。
- Theta 在 PC 和 PC1 的上述投影之间加入,条件是模型 != model1。
- 项目模型和模型 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.model
或 PC.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;