2015-03-25 58 views
-2

我连接两个SQL的时候遇到问题,最后一个输出不是两个。 这两个SQL的工作正常独奏sql oracle连接两个sql的输出

我的SQL的有以下几种:

SQL 1:

select 
table2.displayvalue, 
(count(table2.displayvalue)*5) 
from 
table1, 
table2 
where 
table1.abteilung = table2.STOREDVALUE 
and table1.AKTIV = 1 
group by table2.displayvalue 

SQL的1个输出:

column#1_1 column#2_1 

Blue  15 
Red   5 
Yellow  15 
Pink  120 
Black  75 
LessBlack 20 
MoreBlack 140 
Green  10 
DarkRed  10 
FireRed 135 
FireGreen 25 
LessGreen 5 

SQL 2:

SELECT Projektabteilung, 
     SUM(DATUM) TAGEIST 
FROM(
     select 
     table2.DISPLAYVALUE Projektabteilung, 
     table1.IDENTNAME, 
     count(DISTINCT trunc(table4.datum)) DATUM 
     from 
     table2, 
     table1, 
     table3, 
     table4 
     where 
     table1.ABTEILUNG = table2.STOREDVALUE 
     and table1.PROJEKTBENUTZERID = table3.PROJEKTBENUTZERFK 
     and table3.PROJEKTMITARBEITERID = table4.PROJEKTMITARBEITERFK 
     AND table4.datum BETWEEN sysdate-7 and sysdate 
     AND TO_CHAR(table4.datum, 'D') NOT IN ('6', '7') 
     group by table2.DISPLAYVALUE,table1.IDENTNAME) 
GROUP BY Projektabteilung 

SQL的2输出:

column#1_2  column#2_2 

Pink   35 
Black   9 
LessBlack  7 
Moreblack  17 
FireRed  30 
FireGreen  2 

最后,运行SQL,我想有以下输出:

column#1_1 & column#2_1 together | column#1_2 | column#2_2 

Blue        15    0    
Red        5    0 
Yellow       15    0 
Pink        120    35 
Black        75    9 
LessBlack       20    7 
MoreBlack      140    17 
Green        10    0 
DarkRed       10    0 
FireRed       135    30 
FireGreen       25    2 
LessGreen       5    0 

我什么都试过,但其杀死我。你有帮助吗?

谢谢!

+3

没有提供样本数据,表格,预计输出其:

编辑的问题得到增强后

看来你想做的事外连接上第一列在水晶球中看到的东西...;) – 2015-03-25 10:11:28

+0

我编辑了我的帖子 - 希望现在清楚 – piguy 2015-03-25 10:13:37

+0

不是。不清楚。尝试提供SQL小提琴或表格定义和查询。这当然可以做到,但为了帮助你,我们需要细节。 – 2015-03-25 10:16:10

回答

1

你既没有发布你的表结构也没有你的查询,所以这是很难回答的。

如果您可以添加某种从第一个查询到第二个查询的行“映射”行的列,那么可以这样做。

with headline_1 (headline, rn) as (
    select ..., --<<< your original columns go here 
     row_number() over (order by something) as rn 
    from ... 
), headline_2 (headline, rn) as (
    select ..., --<<< your original columns go here 
     row_number() over (order by something) as rn 
    from ... 
)select h1.headline, h2.headline 
from headline_1 h1 
    full outer join headline_2 h2 on h1.rn = h2.rn 
order by h1.rn; 

row_number() over (order by something) as rn生成用于在结果的每一行,并从两个查询中的行的唯一号码通过该号码匹配。你应该找到一个排序列,让你稳定的排序。像你想

with query_1 (column#1_1, column#2_1) as (
    .. your original first query goes here ... 
), 
query_2 (column#1_2, column#2_2) as (
    .. your original second query goes here ... 
) 
select coalesce(q1.column#1_1, q2.column#1_2) as col1, 
     coalesce(q1.column#2_1, 0) as col2_1, 
     coalesce(q2.column#2_2, 0) as col2_2 
from query_1 q1 
    full outer join query_2 q2 on q1.column#1_1 = q2.column#1_2 
order by 1 
+0

你的答案仍然属于我编辑的文章吗? – piguy 2015-03-25 11:41:16

+0

@piguy:听起来好像你只是想在第一列做一个完整的外连接而已。不需要生成行索引。 – 2015-03-25 11:55:53

+0

感谢您编辑您的文章 - 我现在的问题是我现在不真的如何将您的建议包括在我的代码中? – piguy 2015-03-25 12:15:46

0

如果您使用PDO进行连接,则可以只执行两个查询并使用nextRowSet()前进到第二个查询。

in php我用这个在第二个查询中得到插入id。

$q = $db->prepare($query . $queryfieldnames .')'. $queryvalues.');SELECT SCOPE_IDENTITY() as id'); 
    foreach($myarr as $key => $value) { 
     $q->bindParam(':'.$key,$myarr[$key]); 
    } 
    $q->execute(); 
    $q->nextRowSet(); 
    $res = $q->fetch(PDO::FETCH_ASSOC); 
    $insertid = $res['id']; 
+0

Oracle中没有SCOPE_IDENTITY()' – 2015-03-25 10:17:58

+0

不是为了打死一匹马,但我将它作为我如何使用下一行集的例子。不说我使用oracle。 NextRowSet是pdo驱动程序的一项功能。他可以用他想要的任意查询替换选择范围标识。OP没有提供足够的细节,他正在做什么以及他在做什么。所以我给出了一个通用答案。 – Tschallacka 2015-03-25 10:20:38