3

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

接下来我有一个名为 Cards 的表,其中包含有关以下列格式购买的十个项目的数据:OGCard、Item1ID、...、Item10ID、Item1Quantity、...、Item10Quantity

在表 Items 我得到了这样的结构 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 执行相同的连接,依此类推。你能给我一些解决方案吗?

4

2 回答 2

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 

如果没有表格布局,这只是一个猜测,我猜如果这可行,您需要查看架构的布局方式......

于 2012-05-12T17:32:43.833 回答
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_IDs 可能会丢失,您可以使用 aLEFT JOIN而不是 an INNER JOIN,这样您仍然可以获得当前值的结果。

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

于 2012-05-12T17:21:42.240 回答