SQL-重复需要多个行

时间:2018-08-01 17:30:55

标签: sql oracle oracle-sqldeveloper

SELECT COLUMN_A, COLUMN_B, COLUMN_C
FROM MY_TABLE
WHERE SOMETHING IN ('10', '20', '30', '40', '50', '60', '10');

由于值“ 10”是重复项,所以我只得到6行数据,而不是所需的7行数据。我需要返回值('10','20','30','40','50','60','10')中的每个值的结果。

我如何才能获得2行数据,而不是1行呢?尽管这似乎不切实际,但这正是我需要做的。非常感谢您的协助。

4 个答案:

答案 0 :(得分:1)

您可以使用UNION ALL合并多个查询。

SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '10'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '20'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '30'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '40'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '50'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '60'
union all
SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE WHERE SOMETHING = '10'

无论如何,我不清楚您为什么需要这样做。此外,即使在SOMETHING上有索引,它在数据库负载和性能方面也不是很有效。

答案 1 :(得分:1)

您可以像这样使用UNION ALL

SELECT COLUMN_A,
       COLUMN_B,
       COLUMN_C
       FROM MY_TABLE
       WHERE SOMETHING IN ('10',
                           ...
                           '60')
UNION ALL
SELECT COLUMN_A,
       COLUMN_B,
       COLUMN_C
       FROM MY_TABLE
       WHERE SOMETHING IN ('10');

或者您可以使用过滤器值创建一个临时表并将其联接:

CREATE GLOBAL TEMPORARY TABLE SOMETHINGS
AS
SELECT '10' SOMETHING
       FROM DUAL
UNION ALL
...
UNION ALL
SELECT '10' SOMETHING
       FROM DUAL;

SELECT COLUMN_A,
       COLUMN_B,
       COLUMN_C
       FROM MY_TABLE
            INNER JOIN SOMETHINGS
                       ON SOMETHINGS.SOMETHING = MY_TABLE.SOMETHING;

DROP TABLE SOMETHINGS;

答案 2 :(得分:1)

您可以这样做。

该字符串将转换为嵌套表查询,然后您对该字符串进行联接。

SELECT *
FROM
(
select
  trim(regexp_substr(t.MESSAGES, '[^,]+', 1, levels.column_value))  as SPLIT_MESSAGE
from 
  (SELECT '10, 20, 30, 40, 50, 60, 10' MESSAGES FROM DUAL) t,
  table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.MESSAGES, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
) A
    INNER JOIN MY_TABLE ON MY_TABLE.SOMETHING=A.SPLIT_MESSAGE

答案 3 :(得分:0)

您可以使用join实现此目的。首先将IN CLAUSE中用逗号分隔的值拆分为表格形式,然后将join与您的表格一起使用。

可以使用MSDN https://blogs.msdn.microsoft.com/amitjet/2009/12/11/convert-comma-separated-string-to-table-4-different-approaches/的拆分功能 下面的示例代码:我使用CTE方法进行拆分

DECLARE @PARAMS VARCHAR(50)='10, 20, 30, 40, 50, 60, 10'



;WITH STRCTE(START, STOP) AS
(

      SELECT  1, CHARINDEX(',' , @PARAMS )
      UNION ALL
      SELECT  STOP + 1, CHARINDEX(',' ,@PARAMS  , STOP + 1)
      FROM STRCTE
      WHERE STOP > 0
    )
    SELECT SUBSTRING(@PARAMS , START, CASE WHEN STOP > 0 THEN STOP-START ELSE 4000 END) AS STRINGVALUE INTO #TEMP FROM STRCTE

    SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM MY_TABLE INNER JOIN #TEMP ON SOMETHING = STRINGVALUE