在查询中选择2个唯一列

时间:2017-02-14 16:35:56

标签: sql database oracle oracle11g

如何使用记录构建查询,使得2列是唯一的? 这是我尝试过的代码:

Select x.a, y.b
from table1 x, table2 y
where x.id = y.id;

1 - a
2 - b
3 - a
4 - b
5 - c
1 - c
6 - a
2 - a
should return this:
1 - a
2 - b
5 - c

但是有数据丢失,没关系,我只想要两个独特的列。 我曾尝试使用 group by ,但这并没有获得两者的唯一性。 为了使其更具描述性背后的意图: table1存储分类,table2存储值。一个分类可以具有多个值,并且一个值可以属于任何数量的分类。现在我想从table1中选择所有(或某些)分类并对应于每个选择一个值,条件是如果使用任何其他分类挑选值,则不应重复这些值。在我的例子中,1,2,3..6是分类,a,b,c是值。现在我想选择分类和相应的值,我选择了分类1,2,5和相应的值a,b,c,因为所有其他分类将使值重复(例如3将使值重复,因为已经选择了分类1)。

3 个答案:

答案 0 :(得分:3)

OP正在寻找具有任意分类(table1)的唯一值(table2)。因此,可以使用的方法是枚举来自table2的每组值中的所有分类和值对,然后仅从每个组中选择第一个值。

const getRectQuadrant = (m, n, quad) => {
  const quadrantPlaceholders = Array.from({length: n/2 * m/2});
  const offsetForRightHalf = (quad % 2) * n / 2;
  const offsetForBottomHalf = (quad > 1) * n * m / 2;
  const idsForQuadrant = quadrantPlaceholders.map((_,i) => {
    const idForTopLeft = 2 * i - i % (n / 2);
    return idForTopLeft + offsetForRightHalf + offsetForBottomHalf;
  });
  return idsForQuadrant;
};

console.log(JSON.stringify(getRectQuadrant(4, 6, 0)));
console.log(JSON.stringify(getRectQuadrant(4, 6, 1)));
console.log(JSON.stringify(getRectQuadrant(4, 6, 2)));
console.log(JSON.stringify(getRectQuadrant(4, 6, 3)));

答案 1 :(得分:1)

如果您的数据与上面发布的数据一致,则它已经是唯一的。

1 - a
2 - b
3 - a
4 - b
5 - c
1 - c
6 - a
2 - a

[1,a],[3,a],[6,a],[2,a]都是单独的唯一值。

如果要匹配数据,可以在数字部分使用min或max等聚合函数。你想要的输出不是最小值或最大值,所以不能确定你想要达到的目的。

答案 2 :(得分:1)

听起来像是两级小组吗?

select     count(*), x.a, y.b
from       table1 x
inner join table2 y on x.id = y.id
group by   x.a, y.b;