【问题标题】:How can I write a "no two values in [column_list] are equal" condition?如何编写“[column_list] 中没有两个值相等”条件?
【发布时间】:2014-11-24 07:05:09
【问题描述】:

在 SQL 中,一组列必须具有相等值的条件有点重复:

SELECT * FROM t
WHERE col1 = col2
    AND col2 = col3
    AND col3 = col4;

但这还没有“没有两个值可以相等”类型条件的一半那么糟糕:

SELECT * FROM t
WHERE col1 != col2
    AND col1 != col3 AND col2 != col3
    AND col1 != col4 AND col2 != col4 AND col3 != col4;

我能否在不显式比较每对列的情况下重写此查询,如果可以,如何实现?

在一个完美的世界里,我一开始就没有理由这样做;除此之外,适用于 Oracle 11g 中无限数量列的解决方案会很好。我对 DBMS 有一定的灵活性,我愿意接受(建设性的)建议。

【问题讨论】:

    标签: sql oracle oracle11g database-agnostic


    【解决方案1】:

    我同意这是一个奇怪的情况。但理论上,您可以将列转换为行(键值对),然后按值分组,检查 count(*) > 1。如果所有列都具有唯一值,则不应返回任何行。

    select min(column_name), max(column_name), count(*)
      from (select * from table  t
             unpivot (column_val FOR column_name IN (COL1, COL2, COL3, COL4))
           )
    group by column_val
    having count(*) > 1;
    

    Unpivot 子句可以动态构建。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2019-07-22
      • 2015-08-15
      • 2021-09-06
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      相关资源
      最近更新 更多