3

これのタイトルがあいまいで、この質問はおそらく以前に尋ねられたことがあることはわかっていますが、検索したり、より良いタイトルを書いたりできるように、質問を要約する方法がわかりません! それはおそらく単純なことですが、それは何度も出てきて、私はそれを理解することができません. 次に例を示します。

私がこのテーブルを持っているとしましょうLunch

誰が昼食に何を食べましたか。

昼食にリンゴを持っていた人全員にクエリを実行したい場合は簡単です。次を使用します

SELECT [Name] FROM [Lunch] WHERE [Lunch Item] = 'Apple' GROUP BY [Name]

しかし、昼食にリンゴを食べなかった人のリストを取得したい場合はどうすればよいでしょうか? 私が使用する場合

SELECT [Name] FROM [Lunch] WHERE [Lunch Item] <> 'Apple' GROUP BY [Name]

結果には、リンゴ以外のものも持っていたので、リンゴを持っていた人も含まれます。

私が言うように、これは単純なクエリに違いないと思いますが、構文がどうなるかわかりません。

4

6 に答える 6

2

私は集計を使用してこれらの問題にアプローチすることを好みます。

select [name]
from lunch
group by name
having sum(case when [lunch item] = 'Apple' then 1 else 0 end) = 0;

この構造は非常に一般化できます。リンゴとブドウを持っているがオレンジを持っていない人が必要な場合は、次のようにすることができます。

select [name]
from lunch
group by name
having sum(case when [lunch item] = 'Apple' then 1 else 0 end) > 0 and
       sum(case when [lunch item] = 'Oranges' then 1 else 0 end) > 0 and
       sum(case when [lunch item] = 'Grapes' then 1 else 0 end) = 0
于 2013-04-23T13:50:53.140 に答える
2

人用のテーブルがある場合:

SELECT  *
FROM    people
WHERE   name NOT IN
        (
        SELECT  name
        FROM    lunch
        WHERE   lunchItem = 'apple'
        )

そうでない場合:

SELECT  name
FROM    lunch
EXCEPT
SELECT  name
FROM    lunch
WHERE   lunchItem = 'apple'
于 2013-04-23T13:50:56.080 に答える
1

NOT EXISTSアプローチを使用して

SELECT  *
FROM    Lunch a
WHERE   NOT EXISTS
(
    SELECT  1
    FROM    Lunch b
    WHERE   a.Name = b.Name AND
            b.Item = 'Apple'
)
于 2013-04-23T13:53:36.980 に答える
1

group by 句を使用する場合は、このようなものを使用します。人のリストだけが必要な場合は、他にも多くの方法があります。

SELECT [Name]
FROM [Lunch]
GROUP BY [Name]
HAVING SUM(CASE WHEN [Lunch Item] = 'Apple' then 1 else 0 end) = 0 --people who had a total amount of 0 apples for lunch
于 2013-04-23T13:51:58.753 に答える
1

これが 3 番目のアプローチです。

SELECT DISTINCT Name 
FROM Lunch L
WHERE NOT EXISTS (SELECT 1 FROM Lunch WHERE Name = L.Name AND [Lunch Item] = 'Apple')
于 2013-04-23T13:52:37.397 に答える
0

演算子を使用NOT INして、Apple を持っていたすべての人を除外します。

SELECT * FROM Lunch
WHERE Name NOT IN ( SELECT Name
                    FROM Lunch
                    WHERE LunchItem ="Apple"
                   )

GROUP BY条文は必要ないと思います。

于 2013-04-23T13:55:34.047 に答える