0

stockadj1,列category.它有多个列(如 idno,name,category)。但是我想获得没有重复值的类别,并且如果它的(表)存在与否,一些默认值也会出现。所以我写了一个这样的查询

select 
    'Damages' as category 
union all 
select 
    'Excess Stock' as category 
union all 
select 
    'Shortage' as category 
union all 
select 
    'Stock Journal' as category 
union all 
select 
    distinct category 
from 
    stockadj1 
where 
    category <> '' 
    and lower(category) not in ('damages', 'excess stock', 'shortage', 'stock journal') 
order by 
    category

默认值为

 'Damages', 'Excess Stock', 'Shortage', 'Stock Journal'

这些默认值必须与查询一起使用,所以我像这样使用。但我认为这是一项相当多的工作。如何获得有效(可行)的解决方案?

编辑

这里的默认值是指那些可能存在于表中或不存在的值。

我正在使用 Postgresql 版本 9.0.3

4

2 回答 2

2

不确定您所说的“它的工作量很大”是什么意思,但以下内容需要的输入要少得多

select category
from stockadj1
where category <> ''
union
values ('Damages'),
       ('Excess Stock'),
       ('Shortage')
       ('Stock Journal')
order by category;

union将确保删除重复项,因此无需对整体结果进行区分。

于 2013-10-19T13:09:04.973 回答
0

不会说它效率低下,杂乱无章而且有点脆弱。

如果您还没有,请创建一个类别表。添加一列以将其标记为默认值,如果不是全部都是默认值,则它是一个简单的联合

select Category from Categories Where IsDefault = 1
Union
select category from stockadj1 where category <> ''

不应该需要 distinct,因为 union 是一个集合操作。

看看其余部分,使用 category_id 进行规范化将是一个非常好的主意,如果某个办公室 Wally 说 Excess Stock 应该是 Excess stock,那么您将处于一个糟糕的地方。

那么你根本不需要联合,一切都会从类别表中出来。

如果您需要类别为自由格式或从类别中选择,则为其他添加类别 ID,并在库存调整中具有两个字段,id 和 category_description。仅填写描述,如果 catgeory_id 是其他并且您最终得到。

select Category from Categories Where IsDefault = 1
Union
select category_description from stockadj1 s 
Inner join Categories c On c.Category_id = s.Category_Id
Where c.Category_type = 'Other' 

Category_type 表示它是“其他”类型,并且您想要这种行为。

应该很好地完成这项工作,您只需更改类别表就可以维持 99% 的工作。

于 2013-10-19T10:49:41.093 回答