6

私はしなければならない:

ラップトップではなく PC を販売しているメーカーを見つけます。

このクエリは正しい結果を出力していません:

SELECT maker, type FROM product
WHERE type = 'PC' AND type <> 'Laptop'

これからの出力と正しい出力:

出力

このクエリの結果セット:

SELECT maker, type FROM product

ex2

テーブル スキーマ:

テーブル

これでも機能していません:

SELECT maker, type FROM product
WHERE type IN('PC') AND type NOT IN('Laptop')

注 -type明確にするために追加されています

4

12 に答える 12

7

試す:

SELECT maker
FROM product
GROUP BY maker
HAVING SUM(CASE WHEN type = 'PC' THEN 1 ELSE 0 END) > 0
   AND SUM(CASE WHEN type = 'Laptop' THEN 1 ELSE 0 END) = 0
于 2013-02-01T12:00:04.747 に答える
6

この問題を解決するための多くのエキゾチックな方法があります。ここで、最初に頭に浮かぶ:)

  1. 些細な解決策。

    SELECT DISTINCT maker
       FROM Product
         WHERE type = 'PC' AND maker NOT IN (
             SELECT maker
             FROM Product
             WHERE type = 'Laptop')
    
  2. を使用してJOIN

    SELECT DISTINCT Pr.maker
    FROM Product AS Pr LEFT JOIN Product AS Pr2
        ON Pr.maker = Pr2.maker AND Pr2.type = 'Laptop'
    WHERE Pr.type = 'PC' AND Pr2.maker IS NULL
    
  3. を使用しEXCEPTます。

    SELECT DISTINCT maker
        FROM product AS Pr1
        WHERE type = 'PC'
    EXCEPT
    SELECT DISTINCT Pr2.maker
        FROM product AS Pr2
        WHERE type = 'laptop'
    
  4. とを使用しDISTINCTますNOT EXISTS

    SELECT DISTINCT maker
    FROM Product AS PcP
    WHERE type = 'PC' AND
          NOT EXISTS (SELECT maker
                      FROM Product
                      WHERE type = 'laptop' AND
                      maker = PcP.maker
                     )
    
  5. CASEインクリメント とを使用しますHAVING

    SELECT maker
        FROM product
    GROUP BY maker
    HAVING SUM(CASE WHEN type = 'PC' THEN 1 ELSE 0 END) > 0
       AND SUM(CASE WHEN type = 'Laptop' THEN 1 ELSE 0 END) = 0
    
  6. DISTINCTおよび 比較サブクエリの使用

    SELECT DISTINCT maker
    FROM Product AS Pr
    WHERE (SELECT COUNT(1)
           FROM Product AS Pt
           WHERE Pt.type = 'PC' AND Pt.maker = Pr.maker
          ) > 0 
        AND
          (SELECT COUNT(1)
           FROM Product AS Pt2
           WHERE Pt2.type = 'Laptop' AND
           Pt2.maker = Pr.maker
          ) = 0
    
  7. 使用HAVINGとごまかし (HAVING集計のない列を含めることはできないため、無意味な (この場合) 集計を使用しますMIN(またはMAX- それは問題ではありません)

    SELECT maker
        FROM (SELECT DISTINCT maker, type
              FROM Product
              WHERE type IN ('PC', 'Laptop')
             ) AS T
    GROUP BY maker
    HAVING COUNT(*) = 1 AND MIN(type) = 'PC'
    
于 2016-01-22T09:27:26.547 に答える
4

これを試してください PC を販売しているがラップトップを販売していないメーカーを見つけてください。

SELECT maker , type FROM product
WHERE type = 'PC' AND maker NOT IN 
( SELECT maker FROM product WHERE type = 'laptop' )
于 2013-02-01T12:02:45.137 に答える
1
SELECT DISTINCT maker
FROM Product AS pc_product
WHERE type = 'pc' AND 
      NOT EXISTS (SELECT maker 
                  FROM Product
                  WHERE type = 'laptop' AND 
                        maker = pc_product.maker
                  );
于 2015-05-29T19:46:58.867 に答える
1
select distinct maker 
from product 
where type = 'PC'  
  and maker not in ( select maker from product where type = 'Laptop')

できます

于 2013-06-04T08:25:17.690 に答える
0

問題を解決する簡単な方法

Select maker from product
where type = 'PC'
Except
Select maker from product
where type = 'laptop'
于 2016-06-14T22:10:56.790 に答える
0

where句の値をトリミングすることをお勧めします...いくつかの用事スペースがある可能性があるため、正確な一致が目的の結果を返さない可能性があります。

そのようです:

SELECT maker , type FROM product
WHERE TRIM(type) = 'PC' AND TRIM(type) <> 'Laptop'

または、単に試すこともできます:

SELECT maker , type FROM product
WHERE TRIM(type) = 'PC'

ラップトップと PC が 2 つの別々のタイプである場合は、PC のみをフィルタリングします。

于 2013-02-01T11:59:45.650 に答える
0

以下のようにしてみてください。

    Select maker from product where type in('PC','laptop')
    except
    select maker from product where type='laptop'
于 2015-12-01T05:21:15.513 に答える
-2
select maker from Product where type in('PC')
intersect
select maker from Product where type  in ('PC','Printer')
except
select maker from Product where type='Laptop'
于 2015-08-19T07:11:56.143 に答える