如果1列为空,Oracle Join不会返回数据

如果1列为空,Oracle Join不会返回数据,oracle,Oracle,我使用Oracle查询来检索每个客户的产品价格,但它仅在客户为每个产品(1、4、6、189、191、7、80、235)设置价格时返回行 如何使它在1列为空时返回行?我想为每一位客户排一行,不管他们是否有产品的价格 我也尝试了完全外部连接,在价格表上留下了外部连接,但结果并没有什么不同 举例说明我想要什么: 900001,部分客户,1.59,2.49,3.39,0,0,0,4.92 select ltrim(kust.kunr), kust_adr.ku_name, p1.

我使用Oracle查询来检索每个客户的产品价格,但它仅在客户为每个产品(1、4、6、189、191、7、80、235)设置价格时返回行

如何使它在1列为空时返回行?我想为每一位客户排一行,不管他们是否有产品的价格

我也尝试了完全外部连接,在价格表上留下了外部连接,但结果并没有什么不同

举例说明我想要什么:

900001,部分客户,1.59,2.49,3.39,0,0,0,4.92

select
    ltrim(kust.kunr),
    kust_adr.ku_name,
    p1.sp_auf_m2,
    p2.sp_auf_m2,
    p3.sp_auf_m2,
    p4.sp_auf_m2,
    p5.sp_auf_m2,
    p6.sp_auf_m2,
    p7.sp_auf_m2,
    p8.sp_auf_m2
from
    kust
    inner join
        kust_adr
        on kust.kunr = kust_adr.ku_nr
    full outer join
        sp_przu p1
        on kust.kunr = p1.kunr
    full outer join
        sp_przu p2
        on kust.kunr = p2.kunr
    full outer join
        sp_przu p3
        on kust.kunr = p3.kunr
    full outer join
        sp_przu p4
        on kust.kunr = p4.kunr
    full outer join
        sp_przu p5
        on kust.kunr = p5.kunr
    full outer join
        sp_przu p6
        on kust.kunr = p6.kunr
    full outer join
        sp_przu p7
        on kust.kunr = p7.kunr
    full outer join
        sp_przu p8
        on kust.kunr = p8.kunr
where
    kust_adr.ku_adr_art = 0
    and p1.prl_nr = 2
    and p1.spr_nr = 1
    and p2.prl_nr = 2
    and p2.spr_nr = 4
    and p3.prl_nr = 2
    and p3.spr_nr = 6
    and p4.prl_nr = 2
    and p4.spr_nr = 189
    and p5.prl_nr = 2
    and p5.spr_nr = 191
    and p6.prl_nr = 2
    and p6.spr_nr = 7
    and p7.prl_nr = 2
    and p7.spr_nr = 80
    and p8.prl_nr = 2
    and p8.spr_nr = 235
order by
    kust.kunr;

您的
子句正在将外部联接转换回内部联接-将它们移动到各自的on子句中:

select
    ltrim(kust.kunr),
    kust_adr.ku_name,
    p1.sp_auf_m2,
    p2.sp_auf_m2,
    p3.sp_auf_m2,
    p4.sp_auf_m2,
    p5.sp_auf_m2,
    p6.sp_auf_m2,
    p7.sp_auf_m2,
    p8.sp_auf_m2
from
    kust
    inner join
        kust_adr
        on kust.kunr = kust_adr.ku_nr
    full outer join
        sp_przu p1
        on kust.kunr = p1.kunr
        and p1.prl_nr = 2
        and p1.spr_nr = 1
    full outer join
        sp_przu p2
        on kust.kunr = p2.kunr
        and p2.prl_nr = 2
        and p2.spr_nr = 4
    full outer join
        sp_przu p3
        on kust.kunr = p3.kunr
        and p3.prl_nr = 2
        and p3.spr_nr = 6
    full outer join
        sp_przu p4
        on kust.kunr = p4.kunr
        and p4.prl_nr = 2
        and p4.spr_nr = 189
    full outer join
        sp_przu p5
        on kust.kunr = p5.kunr
        and p5.prl_nr = 2
        and p5.spr_nr = 191
    full outer join
        sp_przu p6
        on kust.kunr = p6.kunr
        and p6.prl_nr = 2
        and p6.spr_nr = 7
    full outer join
        sp_przu p7
        on kust.kunr = p7.kunr
        and p7.prl_nr = 2
        and p7.spr_nr = 80
    full outer join
        sp_przu p8
        on kust.kunr = p8.kunr
        and p8.prl_nr = 2
        and p8.spr_nr = 235
where
    kust_adr.ku_adr_art = 0
order by
    kust.kunr;
我不确定它们是否真的需要完全的外部连接;使用基于值对的单个外部联接,然后旋转该结果可能更简单,例如:

select *
from (
    select
        ltrim(k.kunr) as kunr,
        ka.ku_name,
        p.spr_nr,
        p.sp_auf_m2
    from
        kust k
        inner join
            kust_adr ka
            on k.kunr = ka.ku_nr
        left outer join
            sp_przu p
            on k.kunr = p.kunr
            and p.prl_nr = 2
            and p.spr_nr in (1, 4, 6, 189, 191, 7, 80, 235)
    where
        ka.ku_adr_art = 0
)
pivot (
    max(sp_auf_m2) for (spr_nr) in (1, 4, 6, 189, 191, 7, 80, 235)
)
order by
    kunr;
尽管您可能希望设置别名,而不是让默认的带引号的标识列名与
spr\u nr
值匹配

ORA-00933:SQL命令未正确结束。。。这是10g

直到11g才添加了
pivot
子句,但您可以复制它对聚合大小写表达式的作用(实际上它是在后台执行的):


您的
子句正在将外部联接转换回内部联接-将它们移动到各自的on子句中:

select
    ltrim(kust.kunr),
    kust_adr.ku_name,
    p1.sp_auf_m2,
    p2.sp_auf_m2,
    p3.sp_auf_m2,
    p4.sp_auf_m2,
    p5.sp_auf_m2,
    p6.sp_auf_m2,
    p7.sp_auf_m2,
    p8.sp_auf_m2
from
    kust
    inner join
        kust_adr
        on kust.kunr = kust_adr.ku_nr
    full outer join
        sp_przu p1
        on kust.kunr = p1.kunr
        and p1.prl_nr = 2
        and p1.spr_nr = 1
    full outer join
        sp_przu p2
        on kust.kunr = p2.kunr
        and p2.prl_nr = 2
        and p2.spr_nr = 4
    full outer join
        sp_przu p3
        on kust.kunr = p3.kunr
        and p3.prl_nr = 2
        and p3.spr_nr = 6
    full outer join
        sp_przu p4
        on kust.kunr = p4.kunr
        and p4.prl_nr = 2
        and p4.spr_nr = 189
    full outer join
        sp_przu p5
        on kust.kunr = p5.kunr
        and p5.prl_nr = 2
        and p5.spr_nr = 191
    full outer join
        sp_przu p6
        on kust.kunr = p6.kunr
        and p6.prl_nr = 2
        and p6.spr_nr = 7
    full outer join
        sp_przu p7
        on kust.kunr = p7.kunr
        and p7.prl_nr = 2
        and p7.spr_nr = 80
    full outer join
        sp_przu p8
        on kust.kunr = p8.kunr
        and p8.prl_nr = 2
        and p8.spr_nr = 235
where
    kust_adr.ku_adr_art = 0
order by
    kust.kunr;
我不确定它们是否真的需要完全的外部连接;使用基于值对的单个外部联接,然后旋转该结果可能更简单,例如:

select *
from (
    select
        ltrim(k.kunr) as kunr,
        ka.ku_name,
        p.spr_nr,
        p.sp_auf_m2
    from
        kust k
        inner join
            kust_adr ka
            on k.kunr = ka.ku_nr
        left outer join
            sp_przu p
            on k.kunr = p.kunr
            and p.prl_nr = 2
            and p.spr_nr in (1, 4, 6, 189, 191, 7, 80, 235)
    where
        ka.ku_adr_art = 0
)
pivot (
    max(sp_auf_m2) for (spr_nr) in (1, 4, 6, 189, 191, 7, 80, 235)
)
order by
    kunr;
尽管您可能希望设置别名,而不是让默认的带引号的标识列名与
spr\u nr
值匹配

ORA-00933:SQL命令未正确结束。。。这是10g

直到11g才添加了
pivot
子句,但您可以复制它对聚合大小写表达式的作用(实际上它是在后台执行的):


欢迎来到堆栈溢出。在这里发布问题的一个要求是,它是您遇到的问题的最小表示形式。包含8个联接的查询不被视为最小查询。请简化您的问题,或者至少突出显示问题在查询中的位置。对于where子句中的每个条件,您可以尝试“and(p1.prl_nr=2或p1.prl_nr为NULL)”的形式。在这里发布问题的一个要求是,它是您遇到的问题的最小表示形式。包含8个联接的查询不被视为最小查询。请简化您的问题,或者至少突出显示问题在查询中的位置。您可以针对where子句中的每个条件尝试“and(p1.prl_nr=2或p1.prl_nr为NULL)”的形式!第一个可以根据需要工作,谢谢。第二个要整洁得多,但不适合我。我看不出语法错误在哪里,但是:/error在第21行:ORA-00933:SQL命令没有正确的endedMaybe您使用的是旧版本;pivot直到11g才添加。如果你愿意的话,你也可以对大小写表达式做同样的事情。啊,就是这样,这是10g:(@user316478-我已经添加了10g等价物*8-)谢谢,奇怪的是,我第一行得到835行,第三行得到784行。。。理想情况下,第三个是正确的,因为我有更多的产品ID要添加到组合中,而且更容易做到…:汉克斯!第一个可以根据需要工作,谢谢。第二个要整洁得多,但不适合我。我看不出语法错误在哪里,但是:/error在第21行:ORA-00933:SQL命令没有正确的endedMaybe您使用的是旧版本;pivot直到11g才添加。如果你愿意的话,你也可以对大小写表达式做同样的事情。啊,就是这样,这是10g:(@user316478-我已经添加了10g等价物*8-)谢谢,奇怪的是,我第一行得到835行,第三行得到784行。。。理想情况下,第三个是正确的,因为我有更多的产品ID要添加到组合中,而且更容易做到…:D