我有两个桌子。 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
答案 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