これらは、 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