2

そのため、SSMS(SQL Server Management Studio)で同様のクエリを試行する場合にも問題があるように見えますが、MSAccessが厄介であるという問題が再び発生しているようです。

次のように大まかに定義されたテーブルのコレクションがあります。

  1. テーブルwidget_mfg{id(int)、name(nvarchar)}
  2. テーブルウィジェット{id(int)、name(nvarchar)、mfg_id(int)}
  3. テーブルwidget_component{id(int)、name(nvarchar)、widget_id(int)、component_id}
  4. テーブルコンポーネント{id(int)、name(nvarchar)、...}-このテーブルには最大25列あります

私がやりたいのは、データベースにクエリを実行し、特定のメーカーが使用するすべてのコンポーネントのリストを取得することです。私はこれらのクエリのいくつかを試しました:

SELECT c.*, wc.widget_id, w.mfg_id
FROM ((widget_component wc INNER JOIN widget w ON wc.widget_id = w.id)
INNER JOIN widget_manufacturer wm on w.mfg_id = wm.id)
INNER JOIN component c on c.id = wc.component_id
WHERE wm.id = 1

前の例では、さまざまなウィジェットの複数のwidget_componentリストに含まれているパーツの複製を表示しています。

私もやってみました:

SELECT DISTINCT c.id, c.name, wc.widget_id, w.mfg_id
FROM component c, widget_component wc, widget w, widget_manufacturer wm
WHERE wm.id=w.mfg_id AND wm.id = 1

これは何も表示しません。サブクエリについて読んでいましたが、それらがどのように機能するのか、または現在のアプリケーションにどのように適用されるのかわかりません。

これに関する支援は有益です。

余談ですが、私は一般的にMSAccessとSQLのどちらもあまり得意ではありません。私は基本を知っていますが、それ以上のことはあまりありません。

編集:

このコードを試したところ、すべてのcomponent.idを取得しながら、それぞれ1つのエントリに制限することができます。この結果を使用して、最初の部分のIDを使用してこのデータを選択する残りのすべてのコンポーネントデータ(component。*)のリストを取得するにはどうすればよいですか?

SELECT DISTINCT c.part_no
FROM component c, widget w, widget_component wc, widget_manufacturer wm
WHERE(((c.id=wc.component_id AND wc.widget_id=w.id AND w.mfg_id=wm.id AND wm.id=1)))

(PSこれはおそらくこれを行うための最良の方法ではありませんが、私はまだSQLを学んでいます。)

4

2 に答える 2

1

コンポーネントとウィジェットの関係は 1 対多のようです。したがって、重複します。(つまり、同じコンポーネントが複数のウィジェットで使用されています)。

あなたの選択はほぼOKです -

SELECT c.*, wc.widget_id, w.mfg_id

しかし、wc.widget_id重複を引き起こしています(上記の仮定による)。

wc.widget_idしたがって、から削除するSELECTか、集計します ( minmaxcountなど)。取り外しは簡単です。group by集計する場合は、句を追加することを忘れないでください。

これを試して:

SELECT DISTINCT c.*, w.mfg_id

また -- FWIW、通常は * の代わりにフィールド名を使用することをお勧めします

于 2012-05-23T16:21:50.703 に答える
1

私がやりたいのは、データベースにクエリを実行して、特定のメーカーが使用するすべてのコンポーネントのリストを取得することです

これを行うにはいくつかの方法があります。IN はおそらく最も書きやすい

SELECT c.* 
FROM   component c 
WHERE  c.id IN (SELECT c.component_id 
                FROM   widget w 
                       INNER JOIN widget_component c 
                         ON w.id = c.widget_id 
                WHERE  w.mfg_id = 123) 

IN サブクエリは、特定のメーカーが使用するすべてのコンポーネント ID を検索します。外側のクエリは、その結果である任意の component.id を選択します。そこに 1 回か 1000 回かは関係ありません。コンポーネント レコードは 1 回しか取得されません。

これを行う他の方法は、EXISTS サブクエリを使用するか、クエリへの結合を使用することです (ただし、重複排除する必要があります)。

于 2012-05-23T16:21:52.113 に答える