显示所有记录(包括null)而不经过所有记录

时间:2013-06-19 18:30:06

标签: sql firebird

我有这个SQL查询:

select "Amount",
    "Month",
    SCWM.out_menu1Text
from
(select sum(II2.LocalTAmountWithoutVAT) as "Amount",
    ib_string_right('00' || ib_decodedate_month(II.docdate$date), 2) as "Month",
    sc.id as "Menu"
from IssuedInvoices2 II2
join IssuedInvoices II on II.id = II2.parent_id
left join StoreCards SC on SC.ID = II2.StoreCard_ID
left join firms F on F.id = II.firm_id
where
    ib_decodedate_year(II.docdate$date) = (EXTRACT(YEAR FROM CURRENT_DATE))
    and ib_decodedate_month(II.docdate$date) >= @{_od}
    and ib_decodedate_month(II.docdate$date) <= @{_do}
    and F.id = '@{_firmID}'
group by
    ib_string_right('00' || ib_decodedate_month(II.docdate$date), 2),
    "Menu")
left join ABI_StoreCardsWithMenu("Menu") SCWM on SCWM.OUT_StoreCard_ID = "Menu"
order by
    SCWM.out_menu1Text

有了这个结果:

Result table

但我需要实现这个目标:

Wanted table http://img32.imageshack.us/img32/9486/mjw7.png

功能ABI_StoreCardsWithMenu("Menu") SCWM采用“菜单”列并返回右侧组。例如,在数据库中是“钉子”,并且此函数采用“钉子”的ID并返回组的名称 - &gt; “01.Potrubí是一个合适的人。”

为什么得到这么短的表的原因是,SQL查询在WHERE子句中使用条件。如果被选中的公司没有sc.id属于第二组“02.Nářadí”,那么组将不会出现在结果表中。

我需要的是解决方案,它显示所有组,但我需要避免读取数据库中的每个记录(数据库是如此巨大,加载所有记录需要10-20分钟)。

1 个答案:

答案 0 :(得分:1)

您需要列出所有项目,然后LEFT JOIN您当前的查询(经过一些修改)。

例如,假设您有一个表ITEMS,其中包含所有项目名称(而不是表格,这也可以是(子)查询,视图或可选择的过程),以及包含表格NUMBEROFITEMS项目数量(同样,这也可以是(子)查询,查看或可选程序)。

ITEMS包含:

{ { ID=1, NAME='Item 1'}, { ID=2, NAME='Item 2'} }

NUMBEROFITEMS

{ { ITEMID=1, ITEMCOUNT=35 } }

然后,您可以使用以下查询生成完整列表:

SELECT
    i.NAME,
    COALESCE(ni.ITEMCOUNT, 0)
FROM ITEMS i
LEFT JOIN NUMBEROFITEMS ni ON ni.ITEMID = i.ID

您只需将其扩展为您的特定查询。