Sql 如何检查特定ID的Oracle列值是否完全相同?
我正试图找出一种最佳方法来确定,对于一个Oracle 11g表中的一个特定ID,该表有5列,并且该ID对应100行,这5列的所有列值是否相同 例如: 表名称:表_数据 栏目: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
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。