【发布时间】:2016-02-29 12:26:19
【问题描述】:
我有一个 oracle 查询,它从两个不同的表中获取数据,并将它们显示为:
Project | 20151 | 20152 | 20153 | 20154 | Project_1 | 20151_1 | 20152_1 | 20153_1 | 20154_1
-------------------------------------------------------------------------------------------
这确实得到了我需要的正确数据,但是我需要一种交替每个表中的列的方法。例如:
Project | Project_1 | 20151 | 20151_1 | ...
---------------------------------------
我的查询如下:
SELECT * FROM(
SELECT * FROM
(
SELECT planned.YEAR || planned.MONTH as AAA, planned.DAYS as Amount, PROJ.NAME AS Project
FROM PLANNED_RESOURCE_TAB planned, USER_LINK_VIEW PROJ
WHERE ACTUAL.U_P_LINK = PROJ.ID
AND PROJ.USER_ID = '1'
)
PIVOT
(
SUM(Amount) FOR AAA in (20151,20152,20153,20154)
)
)
PLANNED__ RIGHT OUTER JOIN
(
SELECT * FROM
(
SELECT ACTUAL.YEAR || ACTUAL.MONTH as BBB, ACTUAL.DAYS as Amount, PROJ.NAME AS Project
FROM ACTUAL_RESOURCE_TAB actual, USER_LINK_VIEW PROJ
WHERE ACTUAL.U_P_LINK = PROJ.ID
AND PROJ.USER_ID = '1'
)
PIVOT
(
SUM(Amount) FOR BBB in (20151,20152,20153,20154)
)
)ACTUAL__
ON PLANNED__.PROJECT = ACTUAL__.PROJECT
数据结果会显示在一个 ASP.NET 页面上,所以如果最好在页面本身上操作列是没有问题的。我主要想知道是否可以事先用 SQL 来做,以及随后我将如何去做。
不能在第一个 select 语句中声明这些列,它们将根据用户输入而有所不同。枢轴内的值仅用于我的测试目的,它们将从 ASP.NET 页面动态生成。
提前致谢!
【问题讨论】:
-
它有点属于页面。 SQL 并不是真正为数据表示而设计的,只是用于数据查询。在表现层做表现。
-
有道理,感谢您的反馈。这纯粹是为了维护作品的结构,还是实际上也进行了优化?
-
好吧,目的不是“优化性能”(在某些情况下它会有所帮助,在某些情况下会造成伤害,而在其他情况下则无关紧要)。一切都是为了在适合的地方做事——如果您发现需要对性能至关重要的优化,您总是可以打破所有模式(以某种合理的方式)。例如,让 DB 只返回字符串的前 10 个字符是完全合法的,如果这就是您在演示文稿(或 BL)中需要的全部内容,但在 SQL 中格式化日期时间值没有意义,或使用 UI 标题命名列。