【问题标题】:Select rows with same ID and AMOUNT选择具有相同 ID 和 AMOUNT 的行
【发布时间】:2023-01-11 00:54:49
【问题描述】:

我正在努力解决我试图在 ORACLE DB 19.0.0.0.0 上解决的问题

我有一个像这样的表:

 ID | CODE | AMOUNT | VAR1  | VAR2
+-------------------------------
 10 | 255  |192.50  |CLOSED | 1
 10 | 342  |192.50  |OPEN   | 7
 10 | 921  |255.00  |RUNNING| 2
 10 | 222  |255.00  |CLOSED | 10
 13 | 101  |10.00   |RUNNING| 3
 13 | 122  |19.25   |RUNNING| 7
 71 | 804  |21.25   |OPEN   | 9
 71 | 744  |21.25   |RUNNING| 2
 13 | 100  |950.00  |OPEN   | 10
 90 | 126  |17.80   |RUNNING| 0
 90 | 137  |9.00    |RUNNING| 0

我需要选择具有相同 ID 和相同 AMOUNT 的行。 他们可以成对、三人或更多, 换句话说,我需要丢弃唯一的 ID 和 AMOUNT。 其他列可以有任何值

我希望返回:

 ID | CODE | AMOUNT | VAR1  | VAR2
+-------------------------------
 10 | 255  |192.50  |CLOSED | 1
 10 | 342  |192.50  |OPEN   | 7
 10 | 921  |255.00  |RUNNING| 2
 10 | 222  |255.00  |CLOSED | 10
 71 | 804  |21.25   |OPEN   | 9
 71 | 744  |21.25   |RUNNING| 2

我已经尝试做一个只返回唯一的查询 ID + AMOUNT 行,创建一个“UNIQUE KEYS TABLE”,然后在表中进行 JOIN 或 WHERE,但在我的 如果效率不够

解决这个问题的最佳和有效方法是什么?

【问题讨论】:

  • 每对相同的 id 和 amount 的代码或 var2 是唯一的吗?

标签: sql oracle plsql


【解决方案1】:
WITH CTE(ID ,CODE , AMOUNT , VAR1  , VAR2)AS
(
  SELECT 10 , 255  ,192.50  ,'CLOSED' , 1  UNION ALL
  SELECT 10 , 342  ,192.50  ,'OPEN'   , 7  UNION ALL
  SELECT 10 , 921  ,255.00  ,'RUNNING', 2  UNION ALL
  SELECT  10 , 222  ,255.00  ,'CLOSED' , 10  UNION ALL
  SELECT  13 , 101  ,10.00   ,'RUNNING', 3  UNION ALL
  SELECT  13 , 122  ,19.25   ,'RUNNING', 7  UNION ALL
  SELECT  71 , 804  ,21.25   ,'OPEN'   , 9  UNION ALL
  SELECT  71 , 744  ,21.25   ,'RUNNING', 2  UNION ALL
  SELECT  13 , 100  ,950.00  ,'OPEN'   , 10  UNION ALL
  SELECT  90 , 126  ,17.80   ,'RUNNING', 0  UNION ALL
  SELECT  90 , 137  ,9.00    ,'RUNNING', 0   
)
SELECT C.ID,C.CODE,C.AMOUNT,C.VAR1,C.VAR2
FROM CTE  C
JOIN
 (
   SELECT X.ID,X.AMOUNT
   FROM CTE X
   GROUP BY X.ID,X.AMOUNT
   HAVING COUNT(*)>1
 )ZZ ON C.ID=ZZ.ID AND C.AMOUNT=ZZ.AMOUNT

抱歉,今天 dbfiddle for Oracle 对我不起作用,所以在 MS SQL Server 上测试了解决方案

【讨论】:

    【解决方案2】:

    我们可以使用子查询来获取具有相同 id 和数量的行,然后在外部查询中使用 IN 来添加剩余的列:

    SELECT id, code, amount, var1, var2
    FROM yourtable
    WHERE (id, amount) 
    IN
    (SELECT id, amount
    FROM yourtable
    GROUP BY id, amount
    HAVING COUNT(*)>1)
    ORDER BY id;
    

    在此处使用您的示例数据进行测试:db<>fiddle

    【讨论】:

      【解决方案3】:

      您应该在所有三列上添加一个 INDEX,这会使查询更快。

      在更大的数据库上,INNER JOIN 比 IN 子句更快

      SQL Fiddle

      Oracle 11g R2 架构设置:

      CREATE TABLE Table1
          ("ID" int, "CODE" int, "AMOUNT" int, "VAR1" varchar2(7), "VAR2" int)
      ;
      CREATE INDEX tab1_index_address
      ON Table1("ID","CODE","AMOUNT");
      INSERT ALL 
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (10, 255, 192.50, 'CLOSED', 1)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (10, 342, 192.50, 'OPEN', 7)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (10, 921, 255.00, 'RUNNING', 2)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (10, 222, 255.00, 'CLOSED', 10)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (13, 101, 10.00, 'RUNNING', 3)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (13, 122, 19.25, 'RUNNING', 7)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (71, 804, 21.25, 'OPEN', 9)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (71, 744, 21.25, 'RUNNING', 2)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (13, 100, 950.00, 'OPEN', 10)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (90, 126, 17.80, 'RUNNING', 0)
          INTO Table1 ("ID", "CODE", "AMOUNT", "VAR1", "VAR2")
               VALUES (90, 137, 9.00, 'RUNNING', 0)
      SELECT * FROM dual;
      

      查询 1:

      SELECT tab1.*
      FROM Table1 tab1 INNER JOIN 
      Table1 tab2 ON tab1.ID = tab2.ID AND tab1."AMOUNT" = tab2."AMOUNT"
      AND tab1.CODE <> tab2.CODE
      

      Results:

      | ID | CODE | AMOUNT |    VAR1 | VAR2 |
      |----|------|--------|---------|------|
      | 10 |  921 |    255 | RUNNING |    2 |
      | 10 |  342 |    193 |    OPEN |    7 |
      | 10 |  255 |    193 |  CLOSED |    1 |
      | 10 |  222 |    255 |  CLOSED |   10 |
      | 71 |  804 |     21 |    OPEN |    9 |
      | 71 |  744 |     21 | RUNNING |    2 |
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-06
        • 2020-12-20
        • 2020-10-05
        • 2013-11-04
        • 1970-01-01
        • 2020-03-19
        相关资源
        最近更新 更多