日期:2014-05-18  浏览次数:20386 次

sql唯一性约束
原始:
货单号 商品名 类型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  

该结构为套用,设计不合理吾喷

------解决方案--------------------
SQL code

有表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 行受影响)
--*/

------解决方案--------------------
select distinct id,value2 from tbl
------解决方案--------------------
探讨
谢谢二楼的解答,但是我还是有点困惑,可是是我对数据库不太熟悉的缘故把
希望结果:
货单号 商品名 价格
121 商品一 10
122 商品二 10

我应该使用那个字段做 数据唯一性呢。上诉你用到的是两个字段,但是如果用到了三个字段呢。。
比如:
有表tb, 如下:
id value value2
1 aa eee
1 bb eee
2 aaa eee
2……