2

私の目標は、クエリを作成することです。A、B、C の 3 つのテーブルがあります。テーブルは、A.bID = B.bID、B.cID = C.cID のように記述されています。これにより、基本的に、レコードを a から b にリンクし、b レコードを c からのレコードにリンクするクエリを作成できます。これまでのところ、単純なクエリです。

私の問題は何ですか...クエリに含まれる列の1つ(C.col3と呼びましょう)には一意の値が必要です。この列の値はクエリ結果に 1 回しか表示されませんが、他のテーブルの他の列にはこの要件はありません。

このクエリを書くのを手伝ってくれる人はいますか?

ありがとう...

更新 1:

これが表のレイアウトです(申し訳ありませんが、一般的な名前を使用する必要があります)

表 A
aID、bID、aCol1、aCol2、aCol3 ... aCol10

テーブル B
bID、cID、bCol1、bCol2、bCol3 ... bCol10

表 C
cID、cCol1、cCol2、col3、cCol4 ... cCol10

col3 に一意の値の制約がない場合、クエリは次のように記述します。

SELECT
    A.aID, A.bID, A.aCol1 ... A.aCol10,
    B.bID, B.cID, B.bCol1 ... B.bCol10,
    C.cID, C.cCol1, C.cCol2, C.col3 ... C.cCol10
FROM
    A, B, C
WHERE 
    A.bID = B.bID AND B.cID = C.cID

...しかし、もちろん、C.col3 の値が一意であることは保証されません。

更新 2: 詳細...
テーブル A とテーブル B は 1 対多の関係にあります。A は「ヘッダー」、B は「アイテム」です。
テーブル B とテーブル C は 1 対 1 の関係にあります。

これらのテーブルはキャッシュ メカニズムの一部であるため、多くのデータは似ているように見えますが、一部の列では異なります。

A はヘッダーであるため、ほとんどの重複値は A

にあります。最初に行を A.aID で並べ替える必要がありますが、その後は最初に返された行のみが必要で、C.col3 の値はありません。その列の前の行に表示されます。

それは物事を少し明確にしますか、それともまだ意味がありませんか? :)

最終更新:

Bartosz Klimek の回答を選択したのは、必要なものに最も近いものだったからです。途中でネストされた結合句を変更する必要がありました。

ご協力ありがとうございました!

4

5 に答える 5

3

私はあなたがやろうとしていることの簡単な例を簡単に作るつもりです、そしてうまくいけば、これはあなたが(現在)求めていることが不可能である理由を明らかにするのに役立つでしょう。

顧客テーブル[CustomerID、CustomerName]と注文テーブル[OrderID、CustomerID、DollarAmount]がある場合

顧客のすべての注文が必要な場合:

SELECT CustomerName, OrderID, DollarAmount
FROM Customer, Orders
WHERE Customer.CustomerID = Orders.CustomerID

それは戻るだろう

 "Acme Corp.", 1, $2300
 "Acme Corp.", 2, $3022
 "A company",  3, $1234

すべてが良いです。

しかし、あなたの質問に相当するのは、このクエリを要求することですが、一意のCustomerNamesを使用します。「AcmeCorp」の横にあるOrderIDとDollarAmountには何を表示しますか?

集計を使用して何かを表示できます。

SELECT CustomerName, MAX(OrderID), SUM(DollarAmount)
FROM Customer, Orders
WHERE Customer.CustomerID = Orders.CustomerID
GROUP BY Orders.CustomerID

しかし、あなたは骨材を使いたくないと言っていたと思います。

これは問題を明確に説明していますか?

于 2009-03-31T15:33:58.380 に答える
1
SELECT A.*, B.*, C.*
  FROM C
    JOIN B ON B.cID = C.cID
    JOIN A ON A.bID = B.bID
    JOIN
    (
      SELECT id = min(aID)
        FROM C
          JOIN B ON B.cID = C.cID
          JOIN A ON A.bID = B.bID
        GROUP BY col3
    ) D ON D.id = A.aID

最後のサブクエリにより、各 col3 値に対して、最終的な結果セットに最大 1 つのレコードが含まれることが保証されることに注意してください。選択されたレコードは、最小の aID を持つレコードです。明らかに、aID、bID、および cID は、それぞれ A、B、および C の主キーであると想定しています。

于 2009-03-31T15:23:44.130 に答える
0
select distinct c.col3 from c inner join b on c.cID = b.cID inner join a on b.bID = a.bID
于 2009-03-31T14:17:40.870 に答える
0

テーブルの他の値も必要な場合は、次を使用します。

select max(a.col1), sum(b.col2), col3 from a, b, c
where A.bID = B.bID, and B.cID = C.cID
group by C.col3

グループ化されていないすべての列で、次のような集計関数を使用する必要があります

  • AVG: 列の平均。
  • COUNT: レコード数。
  • MAX: 列の最大値。
  • MIN: 列の最小値。
  • SUM: 列の合計。
于 2009-03-31T14:22:14.293 に答える