尝试仅从数据库

时间:2016-07-28 17:58:55

标签: sql sql-server-2008

我有一个项目数据库,可以在一个单独的行中存储给定项目的每个可用种类。只需按项目名称,数据库记录如下所示:

10316-00-B
10316-00-M
10316-02-B
10316-03-B
10316-04-B
10316-23-B
10316-88-B

......其中" 10316"是实际的项目,然后之后的所有内容代表特定的品种类型。我想编写一个查询,只返回项目的一条记录" 10316" (或其中任何一个),以及与所有其他表列中该项相关联的信息,并忽略其余的。所以我会得到项目" 10316-00-B"的记录,但没有其他的。对于我的查询返回的所有其他项,此过程将重复。

我并不挑剔某个特定组的哪个项目被退回;最重要的是。我只是看到项目10316,10317,10318及其后的每个项目,而不是每个项目和变体。

我已经尝试了DISTINCT左(columnName,5),但是并没有按照我的需要过滤记录。有谁知道如何做到这一点?我使用的是Sql Server 2008 R2。

更新:我正在尝试实施@ mo2提供的解决方案 - 看起来这个最有可能返回给定项目的所有数据,这就是我想要的。不幸的是,我收到了错误"没有为第1列''"指定列名,我不知道如何更正此错误。我的查询版本如下所示:

SELECT * FROM (
   select left(item, 5), col1, col2, ... , row_number() 
   over (partition by LEFT(item, 5) order by item) rn
   from Table      
) t
where rn = 1

最终更新:我将@kbball的答案标记为解决方案,但真的应该归功于@ mo2。 @kbball的答案帮助我理解了@ mo2的答案。

3 个答案:

答案 0 :(得分:1)

如果您只是单独查找一列,那么区别是可行的。但是当你添加你需要的剩余列时,它就会被抛弃。你可以试试这个:

select * from (
    select 
    left(col1, 5) col1,
    col2,
    col3,
    col4,
    row_number() over (partition by left(col1, 5) order by col1) rn
    from your_table
) t
where rn = 1

如果您想获取每个项目的第一个或最后一个记录,可以将order by更改为其他列,例如日期/时间列。

答案 1 :(得分:0)

您希望将特定品种类型作为每个项目的单独字段,就像数据库设计的一般技术一样:

  

10316 | 00 |乙

然后您可以使用:

进行查询
SELECT DISTINCT(item)
FROM itemlist
WHERE itemnum=10316;

希望这有帮助

答案 2 :(得分:0)

This one is a little simpler:

SELECT DISTINCT sub.item
FROM (SELECT LEFT(columnName,5) AS item FROM Table) sub