所以我有这个问题,我必须在哪里显示不属于组织的名称或国家' WHO'在表中是成员。这是我提出的SQL
SELECT DISTINCT ismember.country, country.name
FROM ismember LEFT JOIN country ON ismember.country = country.code
WHERE ismember.organization NOT IN (
SELECT DISTINCT ismember.organization
FROM ismember
WHERE ismember.organization = 'WHO'
)
GROUP BY organization
HAVING COUNT(organization) > 1 ;
它有效,它确实返回了不在世界卫生组织的国家。我的问题是,这种方法排除了没有组织的国家。 I.E它排除那些没有参加成员表的国家。
任何想法如何解决这个问题
答案 0 :(得分:1)
为什么不这样呢?
SELECT code, name FROM country WHERE code NOT IN (
SELECT country FROM ismember WHERE organization = 'WHO'
)
应该做同样的事情。 :)
答案 1 :(得分:0)
解决此问题的一种方法是使用聚合和having
子句:
SELECT im.country, c.name
FROM ismember im LEFT JOIN
country c
ON im.country = c.code
GROUP BY m.country, c.name
HAVING SUM(im.organization = 'WHO') = 0;
答案 2 :(得分:0)
这不是答案,而是解释您的查询的作用:
子查询
SELECT DISTINCT ismember.organization FROM ismember WHmember ismember.organization ='WHO'
对于组织为“WHO”的表格中的每条记录,都会获得字符串“WHO”,然后将所有“WHO”减少为“WHO”。
因此WHERE ismember.organization NOT IN (subquery)
与WHERE ismember.organization <> 'WHO'
你左外加入表国家ismember。这意味着如果成员包含一个不在国家/地区表中的国家/地区,您仍然可以获得该记录。但为什么一个国家不在国家表中呢?这似乎没有意义。你可能得到像123, NULL
这样的记录,这意味着国家代码123不是有效的国家,但是到底是什么?
您按组织分组。因此,每个组织可以获得一个结果行。你不是说你希望国家上市吗?
然后为每个组织选择ismember.country和country.name。由于您未指定任何所需的聚合(如MAX(ismember.country)或MIN(country.name)),因此您将获得随机匹配。因此,如果有一个组织'ABC'与国家1,2和3,你会随机获得三个中的一个。
HAVING COUNT(organization)
与HAVING COUNT(*)
大致相同,即每个组织的国家/地区数量。确切地说:对于非空的所有组织都是相同的(对于null,第一个表达式得到0,第二个表达式得到国家计数)。您希望组织的国家/地区数大于1.因此,您只删除只有一个成员的组织。
如果“ABC”的随机国家/地区代码为1且随机国家/地区名称为“意大利”(它们不必属于一起,则两者都只是组织的独立随机选择)并且同一对恰好是组织'DEF'的选择,然后你删除其中一个,所以你得到1,'意大利'一次。
我很惊讶你说这个查询有一个小缺陷。对不起,我觉得很难相信。