内部将一个字段连接到表中的多个列

时间:2012-05-12 17:18:19

标签: sql sql-server-2008

我有SQL表来保存买家个人数据,例如FirstName,LastName,OGCard; OGCard - 表示客户个人卡号的字段。

接下来我有一张名为Cards的表格,其中包含以下格式购买的十件商品的数据:OGCard,Item1ID,...,Item10ID,Item1Quantity,...,Item10Quantity

在表格项目中,我得到了这样的结构ItemID,ItemName

我想从CardNumber购买所有商品

我想我应该做那样的事情

SELECT Buyers.FirstName, Items.Name, Cards.Item1Quantity
FROM Buyers
INNER JOIN Cards ON Buyers.OGCard=Cards.OGCard
INNER JOIN Items ON Cards.Item1ID=Items.ItemName
WHERE OGCard=13451

通过这种方式,我可以看到第一个项目的名称和数量。但是我无法对列Item2ID执行相同的连接,依此类推。你能给我一些解决方案吗?

2 个答案:

答案 0 :(得分:6)

在不知道如何设置Items表的情况下,您可以这样做:

SELECT Buyers.FirstName
     , Items.Name
     , Cards.Item1Quantity 
     , C2.Item2Quantity
     , C3.Item3Quantity
     , C4.Item4Quantity
     , C5.Item5Quantity
     , C6.Item6Quantity
     , C7.Item7Quantity
     , C8.Item8Quantity
     , C9.Item9Quantity
     , C10.Item10Quantity 
  FROM Buyers 
 INNER JOIN Cards ON Buyers.OGCard=Cards.OGCard 
 INNER JOIN Items ON Cards.Item1ID=Items.ItemName  
  LEFT OUTER JOIN Items ON Cards.Item2D=Items.ItemName C2
  LEFT OUTER JOIN Items ON Cards.Item3D=Items.ItemName C3
  LEFT OUTER JOIN Items ON Cards.Item4D=Items.ItemName C4
  LEFT OUTER JOIN Items ON Cards.Item5D=Items.ItemName C5
  LEFT OUTER JOIN Items ON Cards.Item6D=Items.ItemName C6
  LEFT OUTER JOIN Items ON Cards.Item7D=Items.ItemName C7
  LEFT OUTER JOIN Items ON Cards.Item8D=Items.ItemName C8
  LEFT OUTER JOIN Items ON Cards.Item9D=Items.ItemName C9
  LEFT OUTER JOIN Items ON Cards.Item10D=Items.ItemName C10
 WHERE OGCard=13451 

没有表格布局,这只是一个猜测,我猜如果这有效,你需要看看架构是如何布局的......

答案 1 :(得分:4)

可以使用别名连接同一个表两次:

SELECT
    Buyers.FirstName,
    Items1.Name, Cards.Item1Quantity,
    Items2.Name, Cards.Item2Quantity,
    Items3.Name, Cards.Item3Quantity,
    Items4.Name, Cards.Item4Quantity
FROM Buyers
INNER JOIN Cards ON Buyers.OGCard=Cards.OGCard
INNER JOIN Items AS Items1 ON Cards.Item1ID=Items.ItemName
INNER JOIN Items AS Items2 ON Cards.Item2ID=Items.ItemName
INNER JOIN Items AS Items3 ON Cards.Item3ID=Items.ItemName
INNER JOIN Items AS Items4 ON Cards.Item4ID=Items.ItemName
WHERE OGCard=13451

如果某些Items_n_ID可能丢失,您可以使用LEFT JOIN代替INNER JOIN,这样您仍然可以获得现有值的结果。

但是我强烈建议您规范化数据库,而不是采用这种方法。