使用表示为行的列值过滤表

时间:2013-11-08 14:06:22

标签: sql sql-server

我不知道该怎么说这个问题所以它有意义,但通过下面的例子可能最好地理解这个问题。

我的表的结构使得ID可以具有不同的行值:

PK   ID        VALUE
1    160487    10122
2    160487    MF
3    166980    10147
4    166980    MF
5    166986    10147
6    166986    MF
7    166695    10121

我需要为每个ID值选择一个数字值和相应ID号的列表:

PK   ID        VALUE
1    160487    10122
3    166980    10147
5    166986    10147

如何解决此问题?我使用的是SQL Server 2005。

5 个答案:

答案 0 :(得分:2)

如果您总是有两条记录,其中一条记录为MF,另一条记录为数字,则可以使用:

SELECT PK, ID, VALUE
FROM dbo.TableName t
WHERE EXISTS(SELECT 1 FROM dbo.TableName t2
             WHERE t2.ID=t.ID AND t2.VALUE='MF')
AND ISNUMERIC(t.VALUE) = 1

Sql-Fiddle demo

如果您有多个具有相同ID和数字值的记录,并且您希望在CTE中只需要GROUP BY ID或使用ROW_NUMBER。但是,如果上述情况并非如此,那就更容易了。

答案 1 :(得分:1)

以下是IN的一种方式:

select *
from yourtable
where isnumeric(value) = 1
  and id in (select id from yourtable where value = 'mf')

答案 2 :(得分:0)

试试这个......

SELECT * FROM tableName WHERE id IN (
SELECT DISTINCT dt.id FROM tableName dt WHERE ISNUMERIC(dt.value) = 0)
AND ISNUMERIC(value) = 1

答案 3 :(得分:0)

最有效的方法是将表连接到自身:

select t1.*
from mytable t1
join mytable t2 on t2.id = t1.id
    and t2.value = 'mf'
where isnumeric(t1.value)

如果value列仅包含*数字值'mf',则可以通过将where子句更改为:

来提高性能
where t1.value != 'mf'

答案 4 :(得分:0)

您可以使用: 选择 * FROM tableName WHERE ISNUMERIC(VALUE)= 1   AND ID IN(SELE ID FROM tablewhere value ='mf')