SQL:选择不同于仅列2不同的两列

问题描述:

我在生成查询时遇到了问题(我在网上查找并找不到它)。我想要选择不同的两列,其中只有第二列是不同的。SQL:选择不同于仅列2不同的两列

理想的情况下,它应该是这样的:

SELECT DISTINCT colA, colB 
FROM table 
GROUP BY colA, colB 

与COLB只是不同的条件

例如,这里就是我想它做的事,如果我说的是尚不清楚

colA | colB 
----------- 
abc |1 
abc |2 
abd |1 
abf |1 
xyz |1 
asd |2 

SQL MAGIC

calA | colB 
----------- 
abc |1 
abc |2 

它基本上删除了colB所不同的行。

谢谢!

+0

不同? – 2013-04-29 20:03:15

+0

使用计数,然后做计数> 1时 – Andrew 2013-04-29 20:03:19

一个JOIN的解决方案是:从

什么
SELECT DISTINCT a.* 
FROM table a 
JOIN table b 
    ON a.colA = b.colA 
    AND a.colB != b.colB 
+1

我喜欢这个解决方案! – 2013-04-29 20:13:27

+0

如果colB的值超过两个,将会添加重复项。 – 2013-04-29 20:25:23

+0

@AlvinThompson:啊,'DISTINCT'的晦涩含义... – Wrikken 2013-04-29 20:28:08

你可以做

SELECT MIN(colA) AS colA, colB 
FROM table 
GROUP BY colB 

SELECT MAX(colA) AS colA, colB 
FROM table 
GROUP BY colB 

,但你的问题是有些不清楚,所以我不知道这是你在问什么,还是不行。

要与乘数b计价得到该列的值,可以使用group byhaving条款:

SELECT colA 
FROM table 
GROUP BY colA 
having min(colB) <> max(colB) 

然后,你需要join这回原始查询,不知何故。下面是使用in的方法:

select * 
from table 
where colA in (SELECT colA 
       FROM table 
       GROUP BY colA 
       having min(colB) <> max(colB) 
      ) 

您还可以having count(distinct colB) > 1更换having比较,但我觉得min()/max()比较通常会表现得更好。

+1

在您的查询中,您已按ColB分组,因此“MIN(ColB)”总是等于MAX(ColB)吗? – GarethD 2013-04-29 20:09:02

根据您的示例输出,它看起来像只包含colA的值(如果它们具有多个),但不同的值为colB。你可以是这样做的:

SELECT colA, colB FROM table 
WHERE colA IN (
    SELECT colA 
    FROM table 
    GROUP BY colA 
    HAVING COUNT(DISTINCT colB) > 1) 
+0

是的,这是我正在寻找的措辞。这是完全正确的。我会尽快解决。谢谢!!! – 2013-04-29 20:10:07

+0

很高兴工作!我可以理解这是多么难;我自己有很多麻烦:) – 2013-04-29 20:11:03

+0

但是这不会给@ChristopherBales寻找的输出。它代替了他的计数。 – 2013-04-29 20:20:26

select colA, colB 
from table 
where colA in (select colA from table group by colA having count(*) > 1) 
order by colA, colB