Oracle SQL;如何删除“默认”记录的副本

时间:2016-09-12 17:36:06

标签: sql oracle

我有一个名为T_COUNTRIES的表格,其中存储了所有国家/地区的不同语言的名称。

给定国家/地区代码的默认国家/地区名称由SYSCOUNTRY“ALL”和SYSLANG“eng”标识(请参阅紫罗兰中的行)。

如果找不到某种语言的翻译,应用程序将自动恢复为默认国家/地区名称。

所以我想删除所有与Default(紫罗兰色)相同的COUNTRYCODE和COUNTRYNAME记录(红色的记录),因为它们是重复的。

绿色的人应该留下来,因为某个COUNTRYCODE的COUNTRYNAME翻译与默认值不同。

我正在考虑这个问题,但它根本没有考虑到COUNTRYCODE:

SELECT * FROM T_COUNTRIES WHERE SYSCOUNTRY <> 'ALL' AND COUNTRYNAME IN 
(SELECT COUNTRYNAME FROM T_COUNTRIES WHERE SYSCOUNTRY = 'ALL')

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以使用CONCAT选择绿色行:

SELECT *
FROM t_countries
WHERE syscountry <> 'ALL'
AND concat(countrycode, countryname) NOT IN 
(SELECT concat(countrycode, countryname) 
FROM t_countries
WHERE syscountry = 'ALL')

或者,以下是如何使用连接识别红色行:

SELECT t_countries.*
FROM t_countries
INNER JOIN
(SELECT countrycode, countryname
 FROM t_countries
 WHERE syscountry = 'ALL') sub
 ON t_countries.countrycode = sub.countrycode
 AND t_countries.countryname = sub.countryname
 AND syscountry <> 'ALL'

在这里测试:http://sqlfiddle.com/#!9/df695/7

答案 1 :(得分:0)

您可以将查询更改为

SELECT * FROM 
T_COUNTRIES 
WHERE COUNTRYNAME <> 
(SELECT COUNTRYNAME FROM T_COUNTRIES WHERE SYSCOUNTRY = 'ALL')

根据您的评论,将查询更改为

SELECT * FROM 
T_COUNTRIES 
WHERE COUNTRYNAME = 
(SELECT COUNTRYNAME FROM T_COUNTRIES WHERE SYSCOUNTRY = 'ALL')

请参阅Your Modified Fiddle

答案 2 :(得分:0)

与SYSCOUNTRY =&#39; ALL&#39;相比,具有不同COUNTRYNAME的行该COUNTRYCODE的行。假设SYSCOUNTRY =&#39; ALL&#39;并且不存在1行。对于任何COUNTRYCODE。 (&#34;纠正&#34;行)。

SELECT * 
FROM 
T_COUNTRIES t
WHERE SYSCOUNTRY <> 'ALL' 
   AND COUNTRYNAME <> (SELECT t2.COUNTRYNAME 
         FROM T_COUNTRIES t2 
         WHERE t2.SYSCOUNTRY = 'ALL' AND t2.COUNTRYCODE = t.COUNTRYCODE)

要删除的行

SELECT * 
FROM 
T_COUNTRIES t
WHERE SYSCOUNTRY <> 'ALL' 
   AND COUNTRYNAME = (SELECT t2.COUNTRYNAME 
         FROM T_COUNTRIES t2 
         WHERE t2.SYSCOUNTRY = 'ALL' AND t2.COUNTRYCODE = t.COUNTRYCODE)