Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:比较同一表中的行_Sql - Fatal编程技术网

SQL:比较同一表中的行

SQL:比较同一表中的行,sql,Sql,我试图比较单个表中的行 并找出同一id下的“addr”和“zip”是相同还是不同 id | addr | zip ------+----------+---------- 1 | 123 | 0000 1 | 123 | 0000 1 | 123 | 0001 2 | 222 | 1000 2 | 221 | 1000 因此,结果应该

我试图比较单个表中的行 并找出同一id下的“addr”和“zip”是相同还是不同

  id  |   addr   |   zip
------+----------+----------
  1   |   123    |   0000     
  1   |   123    |   0000    
  1   |   123    |   0001    
  2   |   222    |   1000    
  2   |   221    |   1000
因此,结果应该是ID1具有有效的addr和无效的zip id 2具有无效的地址和有效的zip


任何提示都将不胜感激!谢谢

按id分组。选择id、
计数(不同的地址)
计数(不同的邮政编码)
列。
SELECT id
       , CASE s.addrcount 
         WHEN 1 THEN 'valid' 
         ELSE 'invalid' END as addrok
       , CASE s.zipcount 
         WHEN 1 THEN 'valid'
         ELSE 'invalid' END as zipok
FROM 
(
  SELECT id
         , count(distinct addr) as addrcount
         , count(distinct zip) as zipcount
  FROM table1
  GROUP BY id
) as s
筛选包含不同地址或拉链编号的行
>1

这将为您提供重复数据不一致的ID

例如:

SELECT id, COUNT(DISTINCT addr) nAddr, COUNT(DISTINCT zip) nZip
FROM [mytable]
GROUP BY id
HAVING nAddr > 1 OR nZip > 1
干杯,

查询

SELECT id, COUNT(DISTINCT addr), COUNT(DISTINCT zip)
FROM YOUR_TABLE
GROUP BY id
…应给出示例数据的以下结果

1,1,2
2、2、1

粗体中大于1的数字表示“无效”项目

如果您想实际对此进行筛选,可以使用HAVING子句,例如:

SELECT id, COUNT(DISTINCT addr) ADDR_COUNT, COUNT(DISTINCT zip) ZIP_COUNT
FROM YOUR_TABLE
GROUP BY id
HAVING ADDR_COUNT > 1 OR ZIP_COUNT > 1


我建议,如果您实际上不希望数据库中存在这种“不匹配”的数据,请重新设计您的数据模型,以便在一开始就不会发生重复。没有重复,没有不匹配

-1使用
[tablename]
是TSQL语法。并且不能在聚合列上执行
where
。这就是<代码>的目的。另外,您忘记了一个
distinct
您关于distinct和have的看法是正确的。它是固定的。关于TSQL,我不必与非标准SQL语法结合。如果以前不清楚[我的表]是否应该替换为实际的表名,我现在就说明。谢谢您的帮助!“s.addr计数”应该是这样的,还是计数(s.addr)?不管怎样,我得到的是00907。00000—“此区域缺少右括号:/
是否应该这样使用“s.addrcount”
:是的,您的意思是不能在案例中直接使用计数?就像
…CASE COUNT(DISTINCT addr)当1时,那么…ELSE…结束为which…
?@Andriy,不,您不能在
CASE中使用聚合函数。。当
时,因为聚合函数组合了来自多行和大小写的值。。当按行计算时。这就是为什么您需要subselect。想法是验证id和(addr,zip)之间的函数依赖关系。您的表有重复的行,因此不在中。这正是我提出的解决方案。现在,@OP将测试您的查询并最终接受答案,因为标准的SQL习惯用法将与他的Oracle实例一起使用,没有人对您投反对票(我投赞成票)。我喜欢stackoverflow,lol:D.@Anthony不管它值多少钱,我后来注意到了你的答案,并高估了你的票数,意识到你先到了那里!谢谢你的确认:D。