2010-10-02 38 views
3

什么是SQL命令,用于检查行中没有重复字段的行。只选择具有唯一字段的行

例如:

A A A B B B不应该在结果表。

A B C D E F

只有行即等给出的数据:

A A A B B B 

A B C D E F 

A A B G H Q 

应该返回A B C D E F

+0

编辑以下工作。我只是在寻找一个单行命令,如果存在的话。 – AnEventHorizon 2010-10-02 20:43:23

+0

谢谢,但它们是单列中的值还是分布在多列中? – 2010-10-02 20:56:02

+0

每个字母都属于一列。 – AnEventHorizon 2010-10-02 21:06:02

回答

2

Select distinc *返回唯一行的字段不是唯一的值。 您应该将每列的值与其他值进行比较。 (假设列类型相同)。例如,对于一个4列的表格,你应该做的smoething像:

SELECT Col1, Col2, Col3, Col4 FROM MyTable WHERE 
    Col1 NOT IN (Col2,Col3,Col4) AND 
    Col2 NOT IN (Col3,Col4) AND 
    Col3 <> Col4 
+1

可能更容易使用SELECT Col1,Col2,Col3,Col4 FROM MyTable WHERE Col1 IN(Col2,Col3,...)和Col2 IN(Col1,Col3,...)... – 2010-10-02 20:33:33

+0

是的,这是正确的。但我不想要这个,因为它有很多代码麻烦。我在问是否有一个SQL命令检查你的表在行中的唯一性并返回它。 – AnEventHorizon 2010-10-02 20:34:00

+0

同意。只需将其更改为:WHERE Col1 ** NOT ** IN(Col2,Col3,...) – Kamyar 2010-10-02 20:34:36

0
SELECT DISTINCT * FROM tablename 
0

SELECT DISTINCT col FROM tabl

+0

不,这将仍然返回具有重复值IN THEM的行。我希望DISTINCT值在行中,而不是表中。 – AnEventHorizon 2010-10-02 20:27:59

+4

保持使用封盖使文本更易读。哦,等一下,没有。 – 2010-10-02 20:29:29

+0

这就是所谓的强调。 – AnEventHorizon 2010-10-02 20:30:39

-1

SELECT * FROM MYTABLE

WHERE mytable.col1!= mytable.col2!= mytable.col3 ...

+0

此查询不会运行。您必须逐一比较值。你也应该用<>代替!= – Kamyar 2010-10-02 20:32:08

+0

这只是原理。真正的实现取决于OP DB服务器。你为什么认为!=是错误的。对于AND条款,我同意。 – kofucii 2010-10-02 20:34:51

3

有没有简单的命令来做到这一点。

似乎是一个不寻常的要求,并可能表明,如果所有列都可以互换,表格不是第一范式。

在Microsoft SQL Server

;With YourData AS 
(
select 'A' as C1, 'A' as C2, 'A' as C3, 'B' as C4, 'B' as C5, 'B' as C6 UNION ALL 
select 'A' as C1, 'B' as C2, 'C' as C3, 'D' as C4, 'E' as C5, 'F' as C6 
) 
SELECT * 
FROM YourData 
WHERE 1 = 
     (SELECT TOP 1 COUNT(*) AS Cnt 
     FROM  ( 
       SELECT C1 AS  C 
       UNION ALL 
       SELECT C2 
       UNION ALL 
       SELECT C3 
       UNION ALL 
       SELECT C4 
       UNION ALL 
       SELECT C5 
       UNION ALL 
       SELECT C6 
       ) D 
     GROUP BY C 
     ORDER BY Cnt DESC 
     ) 
+0

+1表格必须标准化。用这种方式查询的好工作;) – MartinodF 2010-10-02 21:32:42