2013-05-28 52 views
2

我有两个表。标题和顺序。标题有title_num。订单有title_num和order_num。每个标题都有很多订单。用一列显示多行

我想显示title_num及其所有的命令。但我想,以显示它让我显示多个order_nums 1个title_num:

title_num| order_num 
1   a 
1   b 
1   c 
2   x 
2   y 

我想它看起来像:

title_num| order_num 

1   a 
      b 
      c 

2   x 
      y 

我使用LEFT JOIN试图对它进行排序标题,但这是我卡住的地方。可以像这样显示吗?

select t.title_num, o.order_num 
from title t 
left join order o 
on t.title_num=o.title_num 
+0

如果您使用的是SQL * Plus,那么您可以使用['break'](http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve009.htm)[描述在文档中](http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_six。htm#i1081534)来实现这一点,包括值之间的差距(例如'title_num nodup skip 1'上的断点)。这似乎没有被遗留给SQL Developer。 –

回答

3

(没有足够的代表发表意见,所以我给的答案选项)

不能隐藏的结果,如果它一样的上一行。相反,你会在代码或报告中处理它。

  • 如果您在报告中显示它,您可以将结果分组到报告管理器中。

  • 如果您在代码中迭代,请使用一个跟踪该列变量的变量。

    用空白字符串初始化变量。然后在迭代查询的数据集时:

    1. 如果当前行值与该变量的值相同,则显示空白。否则,显示行值。
    2. 将该变量设置为当前行的值。
+1

是的,在报告中显示它比试图让我的SQL查询起作用要容易得多。谢谢。 – user2300868

+1

非常好,很高兴我能帮到你! (咳嗽咳嗽..标记我的答案;)) – Stamp

2

您可以用LAG功能和CASE语句做到这一点。

SELECT CASE WHEN LAG(title_num,1) OVER (PARTITION BY title_num ORDER BY order_num) IS NULL THEN title_num 
       ELSE ' ' 
     END 
     ,order_num 
FROM Order 

SQL Fiddle Demo

+0

我试过这第一,但我也有其他参数显示也是如此,我放弃了它。幸运的是,我以某种方式在报告中运作了它。尽管感谢您的帮助,但在尝试使用此代码后,我还是多了解了一些关于查询的信息,所以它仍然有帮助。 – user2300868

1

使用窗函数(在Oracle的说法解析函数)row_number()

SELECT CASE WHEN row_number() OVER (PARTITION BY title_num 
            ORDER BY order_num) = 1 THEN 
     title_num ELSE NULL END AS title_num 
     ,order_num 
FROM ord o 
ORDER BY o.title_num, order_num; 

->SQLfiddle

为什么你JOINtitle?有没有命令的标题?否则,您可以从查询中忽略它。

不要使用保留字如order作为表名。我在我的解决方案中使用了ord

请注意,表格限定o.title_numORDER BY指的是输入列,而不是输出列。

+0

我正在使用连接,因为我需要显示来自两个表的更多参数。但我想我得到了我想要的结果。在看到你的代码后,我意识到我正在考虑这个问题。谢谢。 – user2300868