3

FirstName、LastName、OGCard などの購入者の個人データを保持する SQL テーブルがあります。OGCard - クライアントの個人カード番号を示すフィールド。

次に、OGCard、Item1ID、...、Item10ID、Item1Quantity、...、Item10Quantity の形式で購入された 10 個のアイテムに関するデータを含む Cards というテーブルがあります。

テーブルアイテムでは、そのような構造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

エイリアスを使用して、同じテーブルを 2 回結合することができます。

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、 an の代わりにa を使用しINNER JOINて、存在する値の結果を取得できます。

ただし、このアプローチを使用するのではなく、データベースを正規化することを強くお勧めします。

于 2012-05-12T17:21:42.240 に答える