2012-06-04 113 views
2

我有一个问题,我认为是与我的SQL语句中的加入有关。SQL加入问题

select s.customer as 'Customer', 
    s.store as 'Store', 
    s.item as 'Item', 
    d.dlvry_dt as 'Delivery', 
    i.item_description as 'Description', 
    mj.major_class_description as 'Major Description', 
    s.last_physical_inventory_dt as 'Last Physical Date', 
    s.qty_physical as 'Physical Qty', 
    s.avg_unit_cost as 'Unit Cost', 
    [qty_physical]*[avg_unit_cost] as Value 
from argus.DELIVERY d 
join argus.STORE_INVENTORY s 
    ON (s.store = d.store) 
join argus.ITEM_MASTER i 
    ON (s.item = i.item) 
join argus.MINOR_ITEM_CLASS mi 
    ON (i.minor_item_class = mi.minor_item_class) 
join argus.MAJOR_ITEM_CLASS mj 
    ON (mi.major_item_class = mj.major_item_class) 
where s.last_physical_inventory_dt between '6/29/2011' and '7/2/2012' 
    and s.customer = '20001' 
    and s.last_physical_inventory_dt IS NOT NULL 

它回来看似无限量的一个记录的副本。我加入这些表的方式有什么问题吗?

+0

而不是你正在查看的所有列,我建议选择'COUNT(*)'来找出实际返回的记录数。 – Gabe

+0

哇,这会返回1623697 ...但是它一遍又一遍的记录! – fullOfQuestions

+0

尝试一次注释掉其中一个连接 – Andomar

回答

1
join argus.MINOR_ITEM_CLASS mi 
    ON (i.minor_item_class = mi.minor_item_class) 
join argus.MAJOR_ITEM_CLASS mj 
    ON (mi.major_item_class = mj.major_item_class) 

我的猜测是你的错误驻留在这2个连接之一中。当你只使用JOIN这个词时,它假定你正在尝试做一个INNER JOIN,它返回至少有1到1的所有记录。我不知道你的数据是什么样的,但我认为有很多次要商品类和主要商品类之间存在许多关系,因此当您运行此查询时,几乎每个字段都会收到重复记录,但主要商品类不同。

我会看看结果。大多数列的重复数据不会更改,而其中一列的每行都会有不同的值。这应该告诉你,每行有不同数据的列是你应该以不同方式加入的列。

否则,我会说你的查询格式正确。

+0

我认为这实际上是问题!除了DELIVERY之外,所有东西都是相同的。我应该使用不同的连接吗? – fullOfQuestions

+0

'内部连接'是限制性最强的连接,所以这不是一个意外的大集合的解释 – Andomar

+0

如果传递是具有不同值的列,那是因为您正在将商店表连接到传递表不是一个独特的关键。存在多对多的关系,导致您的交付映射到许多商店,反之亦然。他们是否可以加入一个外键1对1关系? – danmanallen