【发布时间】:2017-02-14 16:35:56
【问题描述】:
如何构建一个包含两列唯一记录的查询? 这是我尝试的代码:
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 会使值重复,因为 a 已经被分类选中1).
【问题讨论】:
-
是什么让你选择 1-a 而不是 2-a、3-a 和 6-a?
-
为了使第二个值唯一,您简单地从第一列中忽略了值。因此,如果我们可以随意忽略任何值,那么空的结果集是否适合您?它将不包含重复项。如果这不适合您:您根据什么规则允许或禁止从结果中删除值?
-
我并不是要你修改任何数据。我只想知道你想应用的规则。如前所述,
select null, null from dual where 1=2已经满足您不选择任何重复项的要求。 -
我和托尔斯滕一样困惑。还有更多的问题吗?您是否尝试选择满足您的唯一性要求的尽可能多的行(尽可能多的行数)?如果不是,为什么需要选择三行,而不仅仅是前两行,或者最后两行?
-
不要指望能够轻松解决这个问题,并且要怀疑你自己开发的任何解决方案。您正在寻找的是最大二分匹配,这是图论中的经典难题。有多项式时间算法可以解决它,并且类已经在 Java 等语言中可用。我不知道是否有人用 PL/SQL 编写过它们中的任何一个,而且在纯 SQL 中不太可能有一个相当好的解决方案。
标签: sql database oracle oracle11g