在oracle查询中复制行

时间:2013-03-14 08:37:03

标签: oracle

我将创建一个查询,该查询将用于在我们的项目中打印标签,并且由于标签数量的计数基于字符串而难以发现。我做了一个看起来像这样的查询:

SELECT 
  wipdatavalue
  , containername
  , l
  , q as qtybox
  , d
  , qtyperbox AS q
  , productname
  , dt
  , dsn
  , CASE
      WHEN instr(wipdatavalue, '-') = 0
        THEN
          to_number(wipdatavalue)
      ELSE
          to_number(substr(wipdatavalue, 1, instr(wipdatavalue, '-') - 1))
    END AS una
  , CASE
      WHEN instr(wipdatavalue, '-') = 0 
        THEN
          to_number(wipdatavalue)
      ELSE
        to_number(substr(wipdatavalue, instr(wipdatavalue, '-') + 1))
    END AS dulo  
  , ROW_NUMBER() OVER (ORDER BY containername) AS n
  , count(*) over() m
FROM trprinting_ls
WHERE containername = 'TRALTESTU0A'
GROUP BY wipdatavalue, containername, l, q, d, qtyperbox, productname, dt, dsn
ORDER BY wipdatavalue

上面的查询将导致以下内容:

enter image description here

但实际上,我必须显示第一个项目(Wipdatavalue 1-4),不仅要显示一次,而且要显示四次:

enter image description here

我尝试了另一个运行良好的查询,但是当我尝试在项目中加载它时,它不会打印标签。我们发现它是因为WITH语句,我们不知道为什么。查询是:

WITH DATA (WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo, m1, n)
     AS (SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo,(dulo - una) + 1 AS m1,una n
           FROM (SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYPERBOX AS QTYBOX, PRODUCTNAME, DT,
                        CASE
                          WHEN instr(wipdatavalue, '-') = 0
                          THEN
                            to_number(wipdatavalue)
                          ELSE
                            to_number(substr(wipdatavalue, 1, instr(wipdatavalue, '-') - 1))
                          END AS una,
                          CASE
                            WHEN instr(wipdatavalue, '-') = 0 
                            THEN
                              to_number(wipdatavalue)
                            ELSE
                              to_number(substr(wipdatavalue, instr(wipdatavalue, '-') + 1))
                          END AS dulo
                   FROM trprinting_ls
                  WHERE containername = 'TRALTESTU0A'
                  )
         UNION ALL
         SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo, m1, n + 1
           FROM DATA
          WHERE n + 1 <= dulo)
SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo, n,
       count(*) OVER () m
FROM DATA
ORDER BY n, wipdatavalue

感谢各位帮忙。

2 个答案:

答案 0 :(得分:0)

尝试此查询

select column_name, count(column_name)
from table
group by column_name
having count (column_name) > 1;

答案 1 :(得分:0)

试试这个

select * 
from your_data
start with instr(Wipdatavalue, '1') > 0
connect by level between regexp_substr(Wipdatavalue, '^\d+') 
and regexp_substr(Wipdatavalue, '\d+$')

这是一个简化的例子

如果你愿意,可以用substr和instr替换regexp_substr(也可能更快)

Here is a sqlfiddle demo