选择包含几乎重复的行

时间:2019-06-17 18:50:22

标签: mysql sql database

我有两个桌子。 price_code 表具有一个在 site 表上引用的外键。

price_code
___________
priceCodeID
siteID
price

site   
______________
siteID
operatorName 
country

我需要选择一些行,例如 country =“ Peru”并根据需要设置 price = 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 
    );

有关价格代码的一些数据:

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 :(得分:0)

您的查询几乎是正确的。您需要将#!/usr/bin/perl use warnings; use strict; use XML::LibXML; my $dom = 'XML::LibXML'->load_xml(IO => *DATA); for my $role ($dom->findnodes('//Role[@role_name]')) { $role->{role_name} = ""; } print $dom; __DATA__ <Root> <Role elemId="id35" island_id="0" role_name="Design" value="True"/> <Role elemId="id34" island_id="0" role_name="Lead" value="False"/> <!-- <Role elemId="id34" island_id="0" role_name="Lead" value="False"/> --> </Root> 更改为open file.xml ; for //@role_name set . "" ; save :b ; 。通过使用WHERE pc1.price_code <> 0前缀,您可以将其设置为相关子查询,因此它可以测试主查询中的行,而不是过滤要由子查询返回的行。

您可以通过在子查询中添加别名来使其更清晰:

WHERE price_code <> 0

答案 1 :(得分:0)

使用“不存在”:

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
)

请参见demo
结果:

> siteID | price | country | operatorName
> -----: | ----: | :------ | :-----------
>     27 |     0 | Peru    | Movistar