Выбор, который содержит почти дублированные строки - PullRequest
0 голосов
/ 17 июня 2019

У меня есть две таблицы.Таблица price_code имеет внешний ключ, который ссылается на таблицу site .

price_code
___________
priceCodeID
siteID
price

и

site   
______________
siteID
operatorName 
country

Мне нужно выбрать строки, которыеНапример, country = "Перу" и имеют цену = 0, как я хочу, но в price_code есть несколько строк, которые имеют одинаковый siteID и имеют две проверки.Мне не нужно рассматривать строку, если siteID имеет цену, отличную от нуля в любом регистре.

SELECT s.siteID, pc1.price, s.country, s.operatorName FROM price_code AS pc1 
INNER JOIN site AS s ON s.siteID = pc1.siteID 
WHERE country = "Peru"
    AND operatorName = "Movistar" AND price = 0 
    AND pc1.siteID NOT IN (
        SELECT siteID FROM price_code WHERE pc1.price <> 0 
    );

Некоторые данные по price_code :

priceCodeID | siteID | price
_____________________________
1000  | 64  |  0
1001  | 64  |  100
1002  | 27  |  0
1003  | 18  |  100
1004  | 17  |  1

А для сайта

siteID  |  operatorName  | country
___________________________________
64  |  Peru |  Movistar
27  |  Peru |  Movistar
18  |  Argentina | Movistar
27  |  Bolivia  |  Claro

И мой результат может быть:

siteID  |  price  | country  | operatorName
____________________________________________
27  |  0  |  Peru  |  Movistar

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Использовать НЕ СУЩЕСТВУЕТ:

SELECT s.siteID, p.price, s.country, s.operatorName 
FROM price_code AS p INNER JOIN site AS s 
ON s.siteID = p.siteID 
WHERE s.country = "Peru" AND s.operatorName = "Movistar" AND p.price = 0 
AND NOT EXISTS (
  SELECT 1 FROM price_code 
  WHERE siteID = p.siteID AND price <> 0
)

См. Демоверсию .
Результаты:

> siteID | price | country | operatorName
> -----: | ----: | :------ | :-----------
>     27 |     0 | Peru    | Movistar  
0 голосов
/ 17 июня 2019

Ваш запрос почти правильный.Вам нужно изменить WHERE pc1.price_code <> 0 на WHERE price_code <> 0.Используя префикс pc1, вы делаете этот коррелированный подзапрос, поэтому он проверяет строку в основном запросе, а не фильтрует строки, возвращаемые подзапросом.

Вы можете сделать его более понятным, добавивпсевдоним подзапроса:

AND pc1.siteID NOT IN (
    SELECT siteID FROM price_code AS pc2 WHERE pc2.price <> 0 
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...