7

私はSQLにかなり慣れておらず、クエリに苦労しています(Access、FWIWを使用)。StackOverflowをGoogleで検索して検索しましたが、この正確なシナリオは見ていません。(これは、正しい検索用語がわからないためかもしれません。)

同様のデータを含む非常に単純なテーブルが2つあります。

table1: state, lname, fname, network
table2: state, lname, fname, network

私が欲しいのは、2つのテーブルで一致する各人/状態の組み合わせと、その人がいる各テーブルのネットワークを見つけることです。

state, lname, fname, t1.network, t2.network.  

その人は、各テーブルの複数のネットワークにいる可能性があります。その人が属する各ネットワーク(両方のテーブルから)を確認したいと思います。

私は以下のようにJOINを使用することから始めました:

SELECT t1.state, t1.lname, t1.fname, t1.network, t2.network
FROM t1 INNER JOIN t2 
ON t1.fname=t2.fname AND t1.lname=t2.lname AND t1.state=t2.state
GROUP BY t1.state, t1.lname, t1.fname, t1.network, t2.network

デカルト積を取得していることがすぐにわかりました。したがって、「NY、Smith、John」がt1の2つのネットワークにあり、t2の3つのネットワークにある場合、次のようになります。

NY, Smith, John, NetworkA, NetworkB
NY, Smith, John, NetworkA, NetworkA
NY, Smith, John, NetworkB, NetworkA
NY, Smith, John, NetworkB, NetworkB
NY, Smith, John, NetworkA, NetworkC
NY, Smith, John, NetworkB, NetworkC

私が本当に見たいのはただ:

NY, Smith, John, NetworkA, NetworkA
NY, Smith, John, NetworkB, NetworkB
NY, Smith, John, NULL, NetworkC

誰かが私に進む方法や正しい方向に私を向ける方法についてアドバイスをくれますか?

4

5 に答える 5

2

したがって、各テーブルのすべてのレコードが同一であり、それぞれのレコードのみが異なるように見えます。つまり、3セットのクエリをUNIONする必要があります。

次のようなものを試してください。

SELECT t1.state, 
   t1.lname, 
   t1.fname, 
   t1.network as t1Network, 
   t2.network as t2Network
FROM table1 t1 
   INNER JOIN table2 t2 
      ON t1.fname=t2.fname 
      AND t1.lname=t2.lname 
      AND t1.state=t2.state
      AND t1.network=t2.network
UNION 
SELECT t1.state, 
   t1.lname, 
   t1.fname, 
   t1.network as t1Network, 
   t2.network as t2Network
FROM table1 t1 
   LEFT JOIN table2 t2 
      ON t1.fname=t2.fname 
      AND t1.lname=t2.lname 
      AND t1.state=t2.state
      AND t1.network=t2.network
WHERE t2.network IS NULL
UNION 
SELECT t2.state, 
   t2.lname, 
   t2.fname, 
   t1.network as t1Network, 
   t2.network as t2Network
FROM table2 t2 
   LEFT JOIN table1 t1
      ON t1.fname=t2.fname 
      AND t1.lname=t2.lname 
      AND t1.state=t2.state
      AND t1.network=t2.network
WHERE t1.network IS NULL

これにより、希望する結果が得られるはずです。

そして、これが確認するSQLフィドルです。

- 編集

今日は考えていません。最初のクエリは本当に必要ありません。2番目のクエリからWHERE条件を削除すると、同じように機能します。疲れた :-)

更新されたクエリは次のとおりです。どちらも正常に機能するはずですが、これは読みやすくなっています。

SELECT t1.state, 
   t1.lname, 
   t1.fname, 
   t1.network as t1Network, 
   t2.network as t2Network
FROM table1 t1 
   LEFT JOIN table2 t2 
      ON t1.fname=t2.fname 
      AND t1.lname=t2.lname 
      AND t1.state=t2.state
      AND t1.network=t2.network
UNION 
SELECT t2.state, 
   t2.lname, 
   t2.fname, 
   t1.network as t1Network, 
   t2.network as t2Network
FROM table2 t2 
   LEFT JOIN table1 t1
      ON t1.fname=t2.fname 
      AND t1.lname=t2.lname 
      AND t1.state=t2.state
      AND t1.network=t2.network
WHERE t1.network IS NULL

そして、更新されたフィドル

ところで-これらは両方ともMSAccessでサポートされているので機能するはずUNIONです。

幸運を。

于 2013-01-26T21:25:57.607 に答える
0
SELECT DISTINCT t1.state, t1.lname, t1.fname, t1.network, t2.network
FROM t1 INNER JOIN t2 
ON t1.fname=t2.fname AND t1.lname=t2.lname AND t1.state=t2.state
GROUP BY t1.state, t1.lname, t1.fname, t1.network, t2.network

そしてあなたはあなたが望むものを手に入れます。

ほとんどすべての参加は、とにかくデカルト積の構築から始まります(SQL Serverの内部:クエリブックを参照)。データをフィルターで除外しようとすると、通常、作成された仮想テーブルは、個別を使用すると個別のセットを返します。実際には、デカルト積を停止することはできません。

于 2013-01-26T19:36:10.767 に答える
0

この場合、UNIONが最善の策です。

SELECT * FROM t1
UNION
SELECT * FROM t2

(このクエリは、両方のテーブルのすべての列が同じタイプで、同じ順序である場合にのみ機能する必要があることに注意してください。それ以外の場合は、を使用するよりも、必要な各列を指定することをお勧めしますSELECT *)。

于 2013-01-26T19:37:19.580 に答える
0

あなたが欲しいのはUNIONです。

次のようなクエリを(SQLビューで)作成します。

SELECT state, lname, fname, network, network
FROM t1
UNION ALL
SELECT state, lname, fname, network, network
FROM t2

次に、そのクエリをクエリする他のクエリを作成します。

詳細を説明するために自分で試してみますが、MSAccessがインストールされていません。

于 2013-01-26T19:43:02.803 に答える
0

1つのオプションは、完全な外部結合を使用することです。

SELECT coalesce(t1.state, t2.state), coalesce(t1.lname, t2.lname), coalesce(t1.fname, t2.fname),
  t1.network, t2.network
FROM t1 FULL OUTER JOIN t2 
ON t1.fname=t2.fname AND t1.lname=t2.lname AND t1.state=t2.state
and t1.network = t2.network

出力:

NY  SMITH   JOHN    A   A
NY  SMITH   JOHN    B   B
NY  SMITH   JOHN    NULL    C  

編集:Accessを使用していることはわかりませんでした。これは標準のSQLですが、そこで機能するかどうかはわかりません。

于 2013-01-26T19:47:27.677 に答える