1

次のテーブルがあるとします。

表1

Name     Food 
______________
Sam      Chips
Tom      Chips
Larry    Chips

表 2

Name     Type
_____________
Sam      Dip
Tom      Dip
Larry    Dip
Marry    Soda
Peter    Soda
Sam      Soda
Larry    Soda
Sam      Beer
Larry    Beer

返品可能です

Name    Type
____________
Sam     Dip
Tom     Dip
Larry   Dip

名前テーブル 1 をグループとして使用し、そのグループをテーブル 2 で正確に一致させますか?

Marry、Peter、Sam、Larry があるため、Soda Type は一致しません。ビールの種類はサムとラリーのみ。

4

4 に答える 4

1

あなたの質問を正しく理解していれば、このようになるサブクエリを使用できます。

 select * 
 from table2 
 where name in (select name 
                from table 1 
                group by name);
于 2012-12-13T19:05:53.857 に答える
0

これらは、 Table2 のエントリの総数が共通名の数と同じであり、 Table1 に追加のエントリ (名前) がない Typeを求めることで見つけることができます。

SQL では:

SELECT Table2.Name, Table2.Type
FROM
(
  SELECT Type
  FROM (SELECT DISTINCT Type FROM Table2) AS types
  WHERE (
    SELECT COUNT(*)
    FROM Table2 i2
    JOIN Table1 i1 ON i1.Name = i2.Name
    WHERE i2.Type = types.Type
  ) = (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = types.Type
  )
  AND (
    SELECT COUNT(*)
    FROM Table1
  ) = (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = types.Type
  )
) AS result
JOIN Table2 ON result.Type = Table2.Type

実際に見てください:http://sqlfiddle.com/#!2/8d50e/1

MySQL では、GROUP_CONCAT関数を使用して、より短く読みやすいクエリを作成できます。

SELECT Table2.Name, Table2.Type
FROM
(
  SELECT Type
  FROM (SELECT DISTINCT Type FROM Table2) AS types
  WHERE (
    SELECT GROUP_CONCAT(Name ORDER BY Name)
    FROM Table2 i2
    WHERE i2.Type = types.Type
  ) = (
    SELECT GROUP_CONCAT(Name ORDER BY Name)
    FROM Table1
  )
) AS result
JOIN Table2 ON result.Type = Table2.Type

group_concat_max_lenに注意してください。

デモ: http://sqlfiddle.com/#!2/af700/1

本当に Table1 の全体を一致させたいかどうかは明確ではありませんでしたが、上記のソリューションは、一致する Food と Type のすべての組み合わせに対して簡単に拡張できます。

SELECT result.Food, Table2.Name, result.Type
FROM
(
  SELECT Type, Food
  FROM (SELECT DISTINCT Type, Food FROM Table2 JOIN Table1) AS combinations
  WHERE (
    SELECT COUNT(*)
    FROM Table2 i2
    JOIN Table1 i1 ON i1.Name = i2.Name
    WHERE i2.Type = combinations.Type
    AND i1.Food = combinations.Food
  ) = (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = combinations.Type
  )
  AND (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = combinations.Type
  ) = (
    SELECT COUNT(*)
    FROM Table1 i1
    WHERE i1.Food = combinations.Food
  )
) AS result
JOIN Table2 ON result.Type = Table2.Type

デモ: http://sqlfiddle.com/#!2/d4d4b/1

于 2012-12-13T19:35:32.483 に答える
0

完全外部結合を使用し、他に何も持ち込まれていないことを確認します。次のクエリは、一致する「型」を取得します。

select t2.type
from table1 t1 full outer join
     table2 t2
     on t1.name = t2.name
group by t2.type
having count(*) = count(t1.name) and -- all t1.names match
       count(*) = count(t2.name)     -- all t2.names match
       count(*) = (select count(*) from table1) -- all are present

これは、重複する名前がないことを前提としています。を適切に使用するdistinctことで、必要に応じてその問題を解決できます。

型を取得したら、table2 に結合してすべての行を取得できます。

于 2012-12-13T19:10:25.780 に答える
0

これがあなたの望むものだと思います。

SELECT t1.Name, MIN(t2.Type)
FROM [Table 1] t1 JOIN [Table 2] t2 ON t1.Name = t2.Name
GROUP BY t1.Name
于 2012-12-13T19:02:13.073 に答える