sql唯一性约束

gtsj96 2012-03-19 02:23:02
原始:
货单号 商品名 类型ID 价格
121 商品一 101 10
121 商品一 103 10
122 商品二 101 10
122 商品二 103 10
"问题:想确保数据唯一性,比如说货单号、商品名、价格一样,
但是类型不一样,不过我只想显示一行数据的SQL,不管类型ID" 求SQL语句


希望结果:
货单号 商品名 类型ID 价格
121 商品一 101或103 10
122 商品二 101或103 10

该结构为套用,设计不合理吾喷
...全文
827 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gtsj96 2012-03-20
  • 打赏
  • 举报
回复
但是也不能排除103, 就是说除了vehicle_type_code不一样,其他字段都一样。 则取一条数据, 101或103
gtsj96 2012-03-20
  • 打赏
  • 举报
回复
其中vehicle_type_code值可能为 101 或 103 ,
运行以上程序语句结果,
0121 0121 ******线 0001 0102 aa 4 101 19.00
0121 0121 ******线 0001 0102 aa 4 103 19.00
0121 0121 ******线 0001 0103 bb 5 101 21.00
0121 0121 ******线 0001 0103 bb 5 103 21.00

实际想要的是
0121 0121 ******线 0001 0102 aa 4 101 19.00
0121 0121 ******线 0001 0103 bb 5 101 21.00
gtsj96 2012-03-20
  • 打赏
  • 举报
回复
语句太长了,其中里面还内嵌 其他表格,,我先贴出sql 语句

SELECT bpl.bus_id,r.route_id,r.route_name,sell.station_id,
s.station_id,s.station_name,d.section_serial,
bpl.vehicle_type_code,
(bpl.base_carriage + bpl.price_item_1 + bpl.price_item_2 + bpl.price_item_3 + bpl.price_item_4 + bpl.price_item_5 + bpl.price_item_6 + bpl.price_item_7 + bpl.price_item_8 + bpl.price_item_9 + bpl.price_item_10+ bpl.price_item_11 + bpl.price_item_12 + bpl.price_item_13 + bpl.price_item_14 + bpl.price_item_15) total_price
FROM route_info r, Route_section_lst d ,station_info s ,station_info v,route_direction_info rd, sell_station_info sell,
Bus_price_lst bpl,(
SELECT distinct a.sell_station_id,a.route_id FROM Route_section_lst a,route_info b,sell_station_info c
WHERE a.route_id=b.route_id AND a.sell_station_id=c.sell_station_id and c.station_id=b.start_station_id) e
WHERE
r.route_id = d.route_id And r.direction_id*=rd.direction_id AND r.start_station_id = v.station_id
AND d.end_station_id = s.station_id And e.route_id = d.route_id
And sell.sell_station_id=d.sell_station_id and bpl.station_id=s.station_id
and bpl.sell_station_id=d.sell_station_id and bpl.price_table_id='003'
and bpl.ticket_type='1' and s.station_id>'0002' ORDER BY bpl.bus_id,d.route_id,sell_station_name,d.section_serial
dawugui 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gtsj96 的回复:]
谢谢二楼的解答,但是我还是有点困惑,可是是我对数据库不太熟悉的缘故把
希望结果:
货单号 商品名 价格
121 商品一 10
122 商品二 10

我应该使用那个字段做 数据唯一性呢。上诉你用到的是两个字段,但是如果用到了三个字段呢。。
比如:
有表tb, 如下:
id value value2
1 aa eee
1 bb eee
2 aaa eee
2……
[/Quote]
针对你这个可以使用distinct
select distinct id , value2 from tb
dawugui 2012-03-19
  • 打赏
  • 举报
回复
--1.如果简单的查询,分组求最大或最小即可.
select 货单号, 商品名 ,min(类型ID) 类型ID ,价格 from tb group by 货单号, 商品名,价格
select 货单号, 商品名 ,max(类型ID) 类型ID ,价格 from tb group by 货单号, 商品名,价格
  • 打赏
  • 举报
回复
select distinct id,value2 from tbl
gtsj96 2012-03-19
  • 打赏
  • 举报
回复
不好意思,,写成二楼了。。
gtsj96 2012-03-19
  • 打赏
  • 举报
回复
谢谢二楼的解答,但是我还是有点困惑,可是是我对数据库不太熟悉的缘故把
希望结果:
货单号 商品名 价格
121 商品一 10
122 商品二 10

我应该使用那个字段做 数据唯一性呢。上诉你用到的是两个字段,但是如果用到了三个字段呢。。
比如:
有表tb, 如下:
id value value2
1 aa eee
1 bb eee
2 aaa eee
2 bbb ddd
2 ccc eee
我确保能显示如果结果
id value2
1 eee
2 eee
2 ddd
  • 打赏
  • 举报
回复

有表tb, 如下:
id value
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id values
1 aa,bb
2 aaa,bbb,ccc
即,group by id, 求value 的和(字符串相加)
1. 旧的解决方法
-- 1. 创建处理函数
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value
FROM tb
WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO
-- 调用函数
SELECt id, values=dbo.f_str(id)
FROM tb
GROUP BY id
-- 2. 新的解决方法
-- 示例数据
DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'
-- 查询处理
SELECT *FROM (SELECT DISTINCT Id FROM @t)A
OUTER APPLY(
SELECT [values]= STUFF(REPLACE(REPLACE(
( SELECT value FROM @t N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N
/*--结果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
--*/

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧