如果这五列的所有列值相同,我试图找出确定Oracle 11g表中特定ID的最佳方法,该表有5列,并且对这个ID说100行。 / p>
例如:
表名: TABLE_DATA
列:
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
所以基于上面的例子,现在只显示6行ID:1,我想检查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。
答案 0 :(得分:3)
你也可以试试这个:
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,那么所有行都有相同的值集,否则不会。
答案 1 :(得分:2)
查看以下内容是否足够快:
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
答案 2 :(得分:0)
这里有一个小问题,您可能想尝试一下(最终,您可以尝试为您找出更好的MINUS
声明):
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