需要ORACLE SQL查询来获取不同的值组合

需要ORACLE SQL查询来获取不同的值组合,sql,oracle,Sql,Oracle,请提供有关此查询的帮助: COL X COL Y 1 A 1 B 1 C 2 A 2 B 2 C 3 A 3 B 3 C 输出应该是 COL X COL Y 1 A or B or C 如果我选了一个, 那么2不应该选择A它可以选择B或C, 如果2选择B,则3不应选择B 输出应该是这样的 1 A 2 B 3 C 或 或 …如果要为列B指定一个不同的值,为列a指定一个

请提供有关此查询的帮助:

COL X   COL Y
1       A
1       B
1       C
2       A
2       B
2       C
3       A
3       B
3       C
输出应该是

COL X  COL Y
1       A or B or C
如果我选了一个, 那么2不应该选择A它可以选择B或C, 如果2选择B,则3不应选择B

输出应该是这样的

1 A
2 B
3 C


如果要为列B指定一个不同的值,为列a指定一个任意值,则可以执行以下操作:

select MIN(A), B
from table t
group by B;

如果您确实希望A和B都有不同的值,那么了解一下。这尤其是匹配算法。我不知道是否有一种非递归的方法可以在SQL中找到这样一个集合。

假设您的数据是固定的,您可以使用交叉连接构建所有组合。查询相当复杂,因为您的数据表示方式不太理想:

SELECT t1."COL X" as x1, t1."COL Y" as y1,
       t2."COL X" as x2, t2."COL Y" as y2,
       t3."COL X" as x3, t3."COL Y" as y3
FROM T t1 CROSS JOIN T t2 CROSS JOIN T t3
WHERE t1."COL Y" <> t2."COL Y"
  AND t1."COL X" <> t2."COL X"
  AND t2."COL Y" <> t3."COL Y"
  AND t2."COL X" <> t3."COL X"
  AND t3."COL Y" <> t1."COL Y"
  AND t3."COL X" <> t1."COL X";

请参阅我在这里的第一篇文章,但我将使用postgres db答案进行回答

select 
  col1,
  col2
from
 (select row_number() over() rn1 , col1 from sample1 group by 2)a
inner join 
 (select row_number() over() rn2, col2 from sample1 group by 2)b
on a.rn1 = b.rn2
order by 1;
这将根据您的规范返回结果集。

在MYSQL中尝试以下操作:

set @rank:=1;
select n.X,n.Y from
(select a.SN as SN1,b.SN as SN2,a.X as X,a.Y as Y,(case when a.X=b.X then @rank:=@rank+1 else       @rank:=1 end) as ra from
(select @rownum:=@rownum+1 as SN,X,Y from temp,(select @rownum:=0) r)a left outer join
(select @rownum1:=@rownum1+1 as SN,X,Y from temp,(select @rownum1:=0) s)b
on a.SN-1=b.SN) n
where n.X=n.ra;

这篇文章格式不好,很难阅读。您可以使用Ctrl+K设置代码部分的格式以确保可读性每个X都有A、B和C,或者可能有一些变体,比如3A、3B,但没有3C?谢谢您的回复。但是您的查询不起作用,它给出了1A、1B、,1 C:谢谢你的帖子。但是我得到了这个错误。ORA-30485:在窗口规范30485中,表达式缺少顺序。00000-窗口规范中缺少ORDER BY表达式*原因:此函数必须使用ORDER BY表达式,或者存在没有任何ORDER BY表达式的聚合组*操作:第92行第10列出现错误,您可以看到我在这里做什么:注意,不同的数据库对语法有要求。我在上面的答案中使用了postgres。
set @rank:=1;
select n.X,n.Y from
(select a.SN as SN1,b.SN as SN2,a.X as X,a.Y as Y,(case when a.X=b.X then @rank:=@rank+1 else       @rank:=1 end) as ra from
(select @rownum:=@rownum+1 as SN,X,Y from temp,(select @rownum:=0) r)a left outer join
(select @rownum1:=@rownum1+1 as SN,X,Y from temp,(select @rownum1:=0) s)b
on a.SN-1=b.SN) n
where n.X=n.ra;