11

したがって、私の問題に関係する 3 つのテーブルがあります。2 つの通常のテーブルと、has many の結合テーブルと、many 関係に属するテーブルがあります。それらは次のようになります。

table1
--id
--data

table2
--id
--data

table1_table2
--table1_id
--table2_id

したがって、私の質問は、table1 の 1 つの項目に対して table1_table2 に 1 つ以上の値を持つものを (結合を使用して) 照会する方法です。例えば:

Table 1
+----------+
|id | data |
+----------+
|1  | none |
+----------+
|4  | match|
+----------+

Table 2
+----------+
|id | data |
+----------+
|1  | one  |
+----------+
|2  | two  |
+----------+

table1_table2
+----------------------+
|table1_id | table2_id |
+----------------------+
|1         | 1         |
+----------------------+
|4         | 1         |
+----------------------+
|4         | 2         |
+----------------------+

テーブル 2 の行 1 と行 2 の両方への結合を介したリンクがあるため、テーブル 1 の行 ID 4 に一致するクエリが必要です。

少し不明確だったかもしれませんが、table1_table2 を from としてではなく結合として使用しています。テーブル 2 の 1 と 2 の両方に一致することを確認する必要があります。

これまでの私のクエリは次のとおりです...

SELECT DISTINCT table1.id,
table2.data

FROM table1

LEFT JOIN table1_table2 ON table1.id = table1_table2.table1_id
LEFT JOIN table2 ON table2.id = table1_table2.table2_id

テーブル 1 のエントリがテーブル 2 の 1 と 2 の両方に一致するようにする場所が必要です。

私が探している出力は次のようになります。

+---------------------+
|table1.id|table2.data|
+---------------------+
|4        |one        |
+---------------------+
|4        |two        |
+---------------------+
4

4 に答える 4

7

次のアプローチは、Table1_Table2 テーブルに重複がないことを保証できる場合に機能します。多分あなたはここから始めて、それを少しフィネスすることができます. JOIN 条件の仕組みに注意してください。結合条件に IN を入れると、WHERE 句に IN 条件を入れる場合とは動作が異なります。

コードを SQL に挿入するために必要な値にハッシュ マークを使用しました。

SELECT Table1.id, COUNT(Table1_Table2.Table2_id)
FROM Table1
JOIN Table1_Table2 ON (Table1_Table2.Table1_id = Table1.id
                   AND Table1_Table2.Table2_id IN (#somelist#))
GROUP BY Table1.id
HAVING COUNT(Table1_Table2.Table2_id) = (#length of somelist#)

おっと -- あなたは私が提案した方法で質問を変更しました。私はあなたの編集を無視しました。しかし、関心のあるすべての Table1 ID が返されるため、これで開始できるはずです。

于 2012-06-04T21:59:20.977 に答える
2

これが私の解決策です。あまり一般化されていません。この解決策があなたの状況に固有すぎるためにうまくいかない場合は、コメントを投稿してください。

SELECT DISTINCT Table1.id
FROM Table1
INNER JOIN table1_table2 a ON (table1.id = table1_table2.table1_id
                           AND table2.id = 1)
INNER JOIN table1_table2 b ON (table1.id = table1_table2.table1_id
                           AND table2.id = 2)
于 2012-06-04T21:21:42.260 に答える
1

SQL Serverでこれを行っている場合は、チェックする値を一時テーブル(またはテーブル変数)に入れてから、@ChrisCunninghamが言ったことのバリエーションを使用します。

CREATE TABLE #temp (Id INT)
INSERT INTO #temp 
VALUES (1, 3, 7)

SELECT a.id AS table1ID, table2.data
FROM
(
       SELECT Table1.id, Table1_Table2.table2_id 
  FROM Table1 JOIN Table1_Table2 
         ON (Table1_Table2.Table1_id = Table1.id                    
  AND Table1_Table2.Table2_id IN (SELECT Id FROM #temp)) 
  GROUP BY Table1.id 
  HAVING COUNT(Table1_Table2.Table2_id) = (SELECT count (*) FROM #temp) 
      ) a
JOIN Table2 ON Table2.id = a.Table2_id 

もちろん、Postgreが一時テーブルに対してどのようなメカニズムを持っているかはわかりませんが、私が行った方法ではなく、ある種の分割関数を使用して一時テーブルの値を作成するストアドプロシージャにすることもできます。しかし、少なくともこれはあなたにアイデアを与えるかもしれません。

于 2012-06-04T22:20:17.003 に答える
0

これを選択できるはずだと思います:

select table1_id, count(*) as count from table1_table2 group by table1_id having count > 2;

グループ化、カウント、そして持つことはあなたの友達です!

于 2012-06-04T20:51:53.293 に答える