在PostgreSQL中编写一个有效的查询

时间:2013-10-19 10:38:21

标签: sql postgresql

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

2 个答案:

答案 0 :(得分:2)

不确定你的意思是“它是一项非常多的工作”,但以下内容需要更少的输入

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

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

答案 1 :(得分:0)

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

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

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

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

看看剩下的部分,使用category_id进行规范化将是一个非常好的主意,如果某些办公室说过剩库存应该是超​​额库存,那么你将会处于一个糟糕的地方。

然后你根本就不需要一个联盟,一切都会出现在类别表中。

如果您需要类别为自由格式或类别中的选项,则为其他类别添加类别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%的工作。