SELECT только строки, когда count = 1 - без дополнительного SELECT или / и имеющие - PullRequest
0 голосов
/ 11 октября 2019

Интересно, есть ли способ построить запрос без объединений и / или с предложением, которое будет возвращать тот же результат, что и запрос ниже? Я уже нашел подобный вопрос ( выберите и подсчитайте строки ), но не нашел ответа.

SELECT ID, CATEGORY, PRODUCT, DESC
    FROM SALES s
    JOIN (SELECT ID, COUNT(CATEGORY)
        FROM SALES
        GROUP by ID
        HAVING count(CATEGORY)=1) S2 ON S.ID=S2.ID;

Таким образом, таблица выглядит как

ID | Country  | Product  | DESC 
1  | USA      | Cream    | Super cream
1  | Canada   | Toothpaste| Great Toothpaste
2  | Germany  | Beer     | Tasty Beer

иЯ бы хотел получить результат

ID | Country  | Product  | DESC 
2  | Germany  | Beer     | Tasty Beer

, потому что для id = 1 назначены 2 разные страны

Я использую SQL Server

В целом меня интересует«самое быстрое» решение. Стол огромный, и мне просто интересно, есть ли способ сделать это умнее.

Ответы [ 3 ]

0 голосов
/ 11 октября 2019

Вы можете попробовать этот запрос:

SELECT ID, CATEGORY, PRODUCT, DESC
FROM SALES s
WHERE 1 = (
  SELECT COUNT(*)
  FROM SALES x
  WHERE x.ID = s.ID
);
0 голосов
/ 11 октября 2019

Один метод использует оконные функции:

SELECT ID, CATEGORY, PRODUCT, DESC
FROM (SELECT s.*, COUNT(*) OVER (PARTITION BY ID) as cnt
      FROM SALES s
     ) s
WHERE cnt = 1;

Однако, самое быстрое решение потребует уникального идентификатора и индекса. Это может быть:

select s.*
from sales s
where not exists (select 1
                  from sales s2
                  where s2.id = s.id and
                        s2.<unique key> <> s.<unique key>
                 );

Для этого может быть использован индекс (id, <unique key>).

Примечание. В этой конкретной формулировке предполагается, что category никогда не является null.

0 голосов
/ 11 октября 2019

Вы можете рассмотреть этот запрос.

select t2.id, t2.category, t2.product, t2.desc from (
    select id, category, product,
        case when (select count(1) from sales where id=t1.id group by id) as ct
        ,desc
    from sales t1) t2 where t2.ct = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...