SQL: необходимо выбрать ответ, в котором пропущены результаты, не относящиеся к категориям - PullRequest
0 голосов
/ 05 ноября 2018

Предположим, мои таблицы выглядят примерно так:

Manufacturer |Model         | Device type
----------------------------------------
Test          001             Desktop
Test          002             Laptop
Test          003             Tablet
Test2         004             Desktop
Test2         005             Laptop
Test2         006             Tablet
Test3         007             Desktop
Test3         008             Desktop
Test4         009             Tablet
Test4         010             Tablet

model         |          price
------------------------------
003                      100
006                      150
009                      175
010                      190

Как отобразить:

Manufacturer
----------
Test4

Я только показываю названия производителей, которые производят исключительно таблетки. Если производитель производит устройства любого другого типа, включая планшеты, я хочу, чтобы они не отображались. Test4 - единственный, кто производит только таблетки, так что это результат, который я хочу.

Еще раз спасибо за помощь, я все еще довольно плохо знаком с SQL, и это было бы хорошим подспорьем.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Этого также можно добиться с помощью агрегации, например ::100100

SELECT a.Manufacturer
FROM Table1 a
GROUP BY a.Manufacturer
HAVING 
    MIN(a.[Device type]) = MAX(a.[Device type]) AND
    MIN(a.[Device type]) = 'Tablet'

Вышеприведенное подтверждает, что Производитель производит только один Тип устройства, проверяя, равен ли минимум (в смысле порядка сортировки - см. здесь ) Типа устройства максимум Тип устройства, а затем выберите те, у которых минимум Tablet.


Или с вложенной агрегацией, например ::11014

SELECT DISTINCT c.Manufacturer
FROM
    Table1 c INNER JOIN
    (
        SELECT b.Manufacturer
        FROM
        (
            SELECT a.Manufacturer, a.[Device type]
            FROM Table1 a 
            GROUP BY a.Manufacturer, a.[Device type]
        ) b
        GROUP BY b.Manufacturer
        HAVING COUNT(*) = 1
    ) d
    ON c.Manufacturer = d.Manufacturer
WHERE 
    c.[Device type] = 'Tablet'

Здесь самый внутренний вложенный запрос выбирает производителей и типы устройств, которые они производят, из которых выбираются производители, которые производят только один тип устройства. Результат этого затем INNER JOIN передается в исходную таблицу, чтобы можно было выбрать тип устройства.

Замените Table1 именем вашей таблицы.

0 голосов
/ 05 ноября 2018

Вы можете попробовать ниже, используя коррелированный подзапрос -

SELECT DISTINCT a.Manufacturer
FROM tablename a
WHERE NOT EXISTS(
    SELECT 1 FROM tablename b 
    WHERE a.Manufacturer = b.Manufacturer AND b.deviceType not in ('Tablet'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...