Sql 如何检查特定ID的Oracle列值是否完全相同?

Sql 如何检查特定ID的Oracle列值是否完全相同?,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我正试图找出一种最佳方法来确定,对于一个Oracle 11g表中的一个特定ID,该表有5列,并且该ID对应100行,这5列的所有列值是否相同 例如: 表名称:表_数据 栏目: TD_ID ID COL1 COL2 COL3 COL4 COL5 ----------------------------------------------------------------------- 1 1 1 0 3

我正试图找出一种最佳方法来确定,对于一个Oracle 11g表中的一个特定ID,该表有5列,并且该ID对应100行,这5列的所有列值是否相同

例如:

表名称:表_数据

栏目:

TD_ID   ID      COL1    COL2    COL3    COL4    COL5
-----------------------------------------------------------------------
1       1       1       0       3       2       0
2       1       1       0       3       2       0
3       1       1       0       3       2       0
4       1       1       0       3       2       0
5       1       1       0       3       2       0
6       1       1       0       3       2       0
因此,基于上面的示例,现在只显示了ID为1的6行,我想检查ID=1的所有COL1、COL2、COL3、COL4和COL5值,告诉我从第一行到最后一行的所有值是否相同–如果是,则返回“Y”,否则返回“N”

给出上述示例,结果将为“Y”,但例如,如果TD_ID=5且COL3=4,则结果将为“N”,因为所有列值都不相同,即:

TD_ID   ID      COL1    COL2    COL3    COL4    COL5
-----------------------------------------------------------------------
1       1       1       0       3       2       0
2       1       1       0       3       2       0
3       1       1       0       3       2       0
4       1       1       0       3       2       0
5       1       1       0       4       2       0
6       1       1       0       3       2       0

我只是不确定确定确定这一点的最快方法是什么,因为我正在查看的表中可能有超过2000行的特定ID。请查看以下内容是否足够快:

SELECT ID, CASE WHEN COUNT(*) > 1 THEN 'No' ELSE 'Yes' END As "Result"
FROM (SELECT DISTINCT ID, COL1, COL2, COL3, COL4, COL5
      FROM Table_Data) dist
GROUP BY ID      

查看以下各项是否足够快:

SELECT ID, CASE WHEN COUNT(*) > 1 THEN 'No' ELSE 'Yes' END As "Result"
FROM (SELECT DISTINCT ID, COL1, COL2, COL3, COL4, COL5
      FROM Table_Data) dist
GROUP BY ID      

您也可以尝试以下方法:

Select ID 
, case when count(distinct COL1 || COL2 || COL3 || COL4 || COL5) > 1 
  then 'N'
  else 'Y' end RESULT
From TABLE_DATA
Group by id;
通过这种方式,您可以按id分组,并计算有多少不同的组合。
如果只有1,则所有行都具有相同的值集,否则不具有相同的值集。

您也可以尝试以下方法:

Select ID 
, case when count(distinct COL1 || COL2 || COL3 || COL4 || COL5) > 1 
  then 'N'
  else 'Y' end RESULT
From TABLE_DATA
Group by id;
通过这种方式,您可以按id分组,并计算有多少不同的组合。
如果只有1,那么所有行都有相同的值集,否则就没有了。

这里有一个小查询,您可能希望最终尝试一下,您可以尝试找出一个更好的减号语句:

SELECT
  CASE 
    WHEN (  -- select count of records from a subquery
            SELECT 
              COUNT(1) 
            FROM
            ( -- select all rows where id = 1
              SELECT
                td.col1
                ,td.col2
                ,td.col3
                ,td.col4
                ,td.col5
              FROM
                table_data td
              WHERE
                td.id = 1
              MINUS -- substract the first row of the table with id = 1
              SELECT
                td.col1
                ,td.col2
                ,td.col3
                ,td.col4
                ,td.col5
              FROM
                table_data td
              WHERE
                td.id = 1
                AND ROWNUM = 1
            )
        ) = 0 -- check if subquery's count equals 0
        AND EXISTS (  -- and exists at least 1 row in the table with id = 1
          SELECT
            1
          FROM
            table_data td
          WHERE
            td.id = 1
            AND ROWNUM = 1
        ) THEN 'Y' 
    ELSE 'N' 
  END AS equal
FROM
  dual

这里有一个小问题,你可能最终会想尝试一下,你可以试着找出一个更好的减号语句:

SELECT
  CASE 
    WHEN (  -- select count of records from a subquery
            SELECT 
              COUNT(1) 
            FROM
            ( -- select all rows where id = 1
              SELECT
                td.col1
                ,td.col2
                ,td.col3
                ,td.col4
                ,td.col5
              FROM
                table_data td
              WHERE
                td.id = 1
              MINUS -- substract the first row of the table with id = 1
              SELECT
                td.col1
                ,td.col2
                ,td.col3
                ,td.col4
                ,td.col5
              FROM
                table_data td
              WHERE
                td.id = 1
                AND ROWNUM = 1
            )
        ) = 0 -- check if subquery's count equals 0
        AND EXISTS (  -- and exists at least 1 row in the table with id = 1
          SELECT
            1
          FROM
            table_data td
          WHERE
            td.id = 1
            AND ROWNUM = 1
        ) THEN 'Y' 
    ELSE 'N' 
  END AS equal
FROM
  dual

这才是真正的痛苦。没有它,您可以执行一些简单的集合操作,省去列出每一列的痛苦。有了它,我很确定你必须明确列出每一列。@JeremyTwFuture你能用例子详细说明一下吗:如果没有TD_ID,简单的集合操作。谢谢,当然可以。当count1=1时选择case,然后从select distinct*from td中选择'Y'或'N'结束,其中id=1 foo。td\u id才是真正的痛苦。没有它,您可以执行一些简单的集合操作,省去列出每一列的痛苦。有了它,我很确定你必须明确列出每一列。@JeremyTwFuture你能用例子详细说明一下吗:如果没有TD_ID,简单的集合操作。谢谢,当然可以。当count1=1时选择case,然后选择'Y'或'N'结束于select distinct*from td,其中id=1 foo。