在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有一些灵活性,我对(建设性的)建议持开放态度。
答案 0 :(得分:1)
我同意这是一个奇怪的情况。但理论上,您可以将列拆分为行(键值对),然后按值进行分组,检查有计数(*)> 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子句。