在一行中得到多行

时间:2012-04-17 11:48:02

标签: sql oracle select

我希望结果行在逗号分隔值的一行中,所以我应用了

rtrim(xmlagg(xmlelement(e, column_name|| ',')).extract('//text()').extract('//text()'),',')

对以下查询的结果行

SELECT 
    TO_DATE('01-04-2012','dd-MM-yyyy') - 1 + rownum AS d
FROM all_objects
WHERE TO_DATE('01-04-2012','dd-MM-yyyy') - 1 + rownum 
    <= TO_DATE('30-04-2012','dd-MM-yyyy')
    MINUS
SELECT TS_DATE  
FROM TS_DTL where emp_id=3 and TS_DATE BETWEEN TO_DATE('01-04-2012','dd-MM-yyyy') 
AND TO_DATE('30-04-2012','dd-MM-yyyy')

当我这样做时如下::

SELECT 
    rtrim(xmlagg(xmlelement(e, TO_DATE('01-04-2012','dd-MM-yyyy') - 1 + rownum || ','))
        .extract('//text()')
        .extract('//text()') ,',') AS d
FROM all_objects
WHERE TO_DATE('01-04-2012','dd-MM-yyyy') - 1 + rownum 
    <= TO_DATE('30-04-2012','dd-MM-yyyy')

MINUS

SELECT 
    rtrim(xmlagg(xmlelement(e, TS_DATE || ','))
        .extract('//text()')
        .extract('//text()') ,',') 
FROM TS_DTL 
WHERE emp_id=3 
AND TS_DATE 
    BETWEEN TO_DATE('01-04-2012','dd-MM-yyyy') 
    AND TO_DATE('30-04-2012','dd-MM-yyyy')

它不会减去第二个查询结果。

1 个答案:

答案 0 :(得分:1)

我猜这是由于一些数据格式化问题。将MINUS替换为UNION ALL并比较生成的行。

或者使用原始选择作为子选择,在外部选择中应用xmlagg魔法:

SELECT rtrim(xmlagg ....))
FROM (
    SELECT
    FROM
    WHERE

    MINUS


    SELECT
    FROM
    WHERE