在多个表中查找值

时间:2014-08-21 14:28:10

标签: java sql database derby

我有一张桌子(让我们称之为ITEMS)并且它有#34;绑定"其他表的数量(让我们说:两个,鞋子和衬衫)。我的意思是" bind" - 当我在这两个表中的一个表中插入一个新行时,我还向表ITEMS插入一行。表SHOES / SHIRTS中的新行有一个字段,表示它对应的ITEM。

ITEMS
 id
 21
 22
 23


SHOES
 id  name size item_id
  1   foo   42      21
  2   bar   40      23

SHIRTS
 id   name  size   length item_id
  1    abc   XXL       50      22

所以,让我们假设我知道其中一个ITEMS的值id(例如id = 22),我想从数据库中获取有关此项目的所有信息。

我尝试select * from shoes where item_id = 22 union select * from shirts where item_id =22并使其工作我添加了选择其他列,以确保数量和类型都很好。这些附加列具有默认值,我使我的Java应用程序忽略这些结果,它工作不知何故,但我觉得这太硬了;除了它适用于两列,但可能有更多的列,而不仅仅是这两列。这就是为什么我问你,Stack Overflow - 我怎么能SELECT * FROM All tables WHERE item_id = 22

修改

我尝试了JOIN,使用JOIN我的结果看起来像是ITEMS-JOINED SHOES-JOINED SHIRT和零行。 LEFT JOIN可能是答案,但我仍然不知道如何以编程方式选择何时选择SHIRTS. *或SHOES.*

4 个答案:

答案 0 :(得分:2)

此帖子不是您原始问题的答案,而是对您上次评论的回复。

关系数据库基于实体之间的关系。关系可以是一对一,一对多等等。在您的情况下,是一个实体,可以在所有产品类型中共享许多共同属性,例如价格,生产商,供应商,数量,性别等。 Shoe 在这种情况下仅是该实体的产品类型属性。这种方法只会帮助您消除您现在遇到的问题,因为您不必担心要查询哪个表,因为只有一个items表。

规范化有助于建立关系,例如,如果要素颜色仅依赖于itemID,那么它将在同一个表中。如果颜色是一个实体本身,例如itemID仅描述了一个可用于不同颜色的模型,那么您需要一个人colors 1}}表和一个中间表,它将itemID与不同的颜色称为复合键。同样,您不必担心以编程方式选择哪个表,因为鞋子和衬衫的颜色将位于同一个表中。您只需LEFT JOIN该表,以防 正如您在这种情况下可能知道的那样,LEFT JOIN将始终返回,如果没有与之关联的颜色将返回null颜色柱。同样适用于其他属性,如大小,样式,生产者,数量等。请注意,当你有生产者然后它去一个单独的表,因为项目和生产者之间的关系可能是多对一(许多项目可以有必须在item表中引用相同的生产者)和ID。生产者也可以有许多不同的联系号码,然后联系信息也会转到个人表格。

此方法允许您构建一个单一查询,检索您感兴趣的项目和所有必需的属性。例如,您有鞋类产品说明页面,然后执行以下操作:

SELECT      *   
FROM        items AS i
LEFT JOIN   item_colours AS ic ON ic.itemID = i.itemID
LEFT JOIN   colours AS c ON ic.colourID = c.colourID
WHERE       product_type = 'shoes'

我希望我上面的评论现在更有意义。

答案 1 :(得分:1)

你要做的是JOIN,但是你要把桌子关系弄得一团糟。

主要有两种关系:

ITEMS <-> SHOES
ITEMS <-> SHIRTS

在您的尝试中,您尝试关联两个不相关的表:SHOESSHIRTS

要从三个表中获取所有数据,您需要两个JOIN,每个关系一个:

SELECT * FROM ITEMS
 JOIN SHOES ON SHOES.item_id = ITEMS.id
 JOIN SHIRTS ON SHIRTS.item_id = ITEMS.id

要获取单个值,您可以使用where子句(最好是左连接以避免显示null值):

SELECT * FROM ITEMS
 LEFT JOIN SHOES ON SHOES.item_id = ITEMS.id
 LEFT JOIN SHIRTS ON SHIRTS.item_id = ITEMS.id
 WHERE ITEMS.id = <your_id>

您不知道如何以编程方式选择何时SELECT SHIRTS.*SHOES.* ,这表明您需要重新考虑数据模型并重写ITEM表。

也许SHOE_TYPE <-> SHOE_ITEMSHIRT_TYPE <-> SHIRT_ITEM ER模型是更好的方法。

另一种方法是拥有PRODUCT表,PRODUCT_TYPE表具有共同的产品类型属性,PRODUCT_TYPE_ATTRIBUTE表用于特定属性。

答案 2 :(得分:1)

3个表格之间的关系需要&#34;外部联接&#34;如果同时加入所有3个。

SELECT
      items.id
    , coalesce(shoes.name,shirts.name) as name
FROM ITEMS
 LEFT OUTER JOIN SHOES  ON SHOES.item_id = ITEMS.id
 LEFT OUTER JOIN SHIRTS ON SHIRTS.item_id = ITEMS.id

Take items.id = 22.这只存在于SHIRTS,而不是SHOES。因此,如果连接仅允许&#34;完全匹配&#34;你不能完全匹配&#34;鞋子和衬衫都是22,内部连接&#34;需要完全匹配。

&#34;外部联接&#34;允许存在不匹配的条件,所以在这里我们肯定需要这些。

函数COALESCE()从参数返回第一个NON-NULL值。因此,如果鞋子名称为NULL,则会返回衬衫名称,反之亦然。

答案 3 :(得分:0)

在这种情况下,您需要执行Left Join,因为您不确定该项目属于哪个表格:

Select      H.*, T.*
From        Items   I
Left Join   Shoes   H On I.id = H.item_id
Left Join   Shirts  T On I.Id = T.item_id
Where       I.id = 22

理想情况下,这将采用不同的结构,但由于第22项是衬衫,您将看到Null表的Shoes值以及Shirts表中的数据