Sqlserver 2005数据库两个表数据问题
如果一个数据库中有两个表A(name,price),B(name,num)A表有数据('索尼',8000)('戴尔',88)B表有数据('索尼SS',20)但A表的索尼和...
如果一个数据库中有两个表A(name,price),B(name,num) A表有数据('索尼',8000)('戴尔',88) B表有数据('索尼SS',20) 但A表的索尼和B表是同一个物品,怎么把B表中索尼SS的数量(num)列放入到A表的索尼中,这是一个列子,而且表中有很多这种名字相近,但是同一种物品的数据,怎么弄?求高手指导!!感激不尽!!!
A表的列是名称,价格 B表的是名称、数量
2L的朋友说的很正确:这里问题的关键是名称相近但不同,如何连接? 展开
A表的列是名称,价格 B表的是名称、数量
2L的朋友说的很正确:这里问题的关键是名称相近但不同,如何连接? 展开
15个回答
展开全部
可以将这两张表连接起来做成一个视图,视图包含名称,A表的price和B表的num。
这里问题的关键是名称相近但不同,如果连接。
对于你列举的例子可以用CHARINDEX(A.name, B.name) > 0 or CHARINDEX(B.name, A.name) > 0 > 0
这样只要A的名称包含B的名称或者B的名称包含A的名称都会被列出。
如果名称中包含空格等,可以使用ltrim或rtrim。
其他相关的字符串处理函数也列出来供您参考。
【字符串比较函数】
1、CHARINDEX()
返回字符串中某个指定的子串出现的开始位置。
CHARINDEX (<’substring_expression’>, <expression>)
其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。
此函数不能用于TEXT 和IMAGE 数据类型。
2、PATINDEX()
返回字符串中某个指定的子串出现的开始位置。
PATINDEX (<’%substring _expression%’>, <column_ name>)其中子串表达式前后必须有百分号“%”否则返回值为0。
与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于CHAR、 VARCHAR 和TEXT 数据类型。
二、去空格函数
1、LTRIM() 把字符串头部的空格去掉。
2、RTRIM() 把字符串尾部的空格去掉。
三、取子串函数
1、left()
LEFT (<character_expression>, <integer_expression>)
返回character_expression 左起 integer_expression 个字符。
2、RIGHT()
RIGHT (<character_expression>, <integer_expression>)
返回character_expression 右起 integer_expression 个字符。
3、SUBSTRING()
SUBSTRING (<expression>, <starting_ position>, length)
返回从字符串左边第starting_ position 个字符起length个字符的部分。
【字符串操作函数】
1、QUOTENAME()
返回被特定字符括起来的字符串。
QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character 标明括字符串所用的字符,缺省值为“[]”。
2、REPLICATE()
返回一个重复character_expression 指定次数的字符串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值,则返回NULL 。
3、REVERSE()
将指定的字符串的字符排列顺序颠倒。
REVERSE (<character_expression>) 其中character_expression 可以是字符串、常数或一个列的值。
4、REPLACE()
返回被替换了指定子串的字符串。
REPLACE (<string_expression1>, <string_expression2>, <string_expression3>) 用string_expression3 替换在string_expression1 中的子串string_expression2。
4、SPACE()
返回一个有指定长度的空白字符串。
SPACE (<integer_expression>) 如果integer_expression 值为负值,则返回NULL 。
5、STUFF()
用另一子串替换字符串指定位置、长度的子串。
STUFF (<character_expression1>, <start_ position>, <length>,<character_expression2>)
如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回NULL 值。
如果length 长度大于character_expression1 中 start_ position 以右的长度,则character_expression1 只保留首字符。
这里问题的关键是名称相近但不同,如果连接。
对于你列举的例子可以用CHARINDEX(A.name, B.name) > 0 or CHARINDEX(B.name, A.name) > 0 > 0
这样只要A的名称包含B的名称或者B的名称包含A的名称都会被列出。
如果名称中包含空格等,可以使用ltrim或rtrim。
其他相关的字符串处理函数也列出来供您参考。
【字符串比较函数】
1、CHARINDEX()
返回字符串中某个指定的子串出现的开始位置。
CHARINDEX (<’substring_expression’>, <expression>)
其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。
此函数不能用于TEXT 和IMAGE 数据类型。
2、PATINDEX()
返回字符串中某个指定的子串出现的开始位置。
PATINDEX (<’%substring _expression%’>, <column_ name>)其中子串表达式前后必须有百分号“%”否则返回值为0。
与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于CHAR、 VARCHAR 和TEXT 数据类型。
二、去空格函数
1、LTRIM() 把字符串头部的空格去掉。
2、RTRIM() 把字符串尾部的空格去掉。
三、取子串函数
1、left()
LEFT (<character_expression>, <integer_expression>)
返回character_expression 左起 integer_expression 个字符。
2、RIGHT()
RIGHT (<character_expression>, <integer_expression>)
返回character_expression 右起 integer_expression 个字符。
3、SUBSTRING()
SUBSTRING (<expression>, <starting_ position>, length)
返回从字符串左边第starting_ position 个字符起length个字符的部分。
【字符串操作函数】
1、QUOTENAME()
返回被特定字符括起来的字符串。
QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character 标明括字符串所用的字符,缺省值为“[]”。
2、REPLICATE()
返回一个重复character_expression 指定次数的字符串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值,则返回NULL 。
3、REVERSE()
将指定的字符串的字符排列顺序颠倒。
REVERSE (<character_expression>) 其中character_expression 可以是字符串、常数或一个列的值。
4、REPLACE()
返回被替换了指定子串的字符串。
REPLACE (<string_expression1>, <string_expression2>, <string_expression3>) 用string_expression3 替换在string_expression1 中的子串string_expression2。
4、SPACE()
返回一个有指定长度的空白字符串。
SPACE (<integer_expression>) 如果integer_expression 值为负值,则返回NULL 。
5、STUFF()
用另一子串替换字符串指定位置、长度的子串。
STUFF (<character_expression1>, <start_ position>, <length>,<character_expression2>)
如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回NULL 值。
如果length 长度大于character_expression1 中 start_ position 以右的长度,则character_expression1 只保留首字符。
追问
1、CHARINDEX()
返回字符串中某个指定的子串出现的开始位置。
CHARINDEX (, )
其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。
可以告诉我详细的SQL语句吗?
追答
SELECT * from A, B
WHERE CHARINDEX(A.name, B.name) > 0 or CHARINDEX(B.name, A.name) > 0
展开全部
可以首先尝试这么查询一下看看
SELECT
A.name AS A表名字,
B.name AS B表名字
FROM
A JOIN B
ON(
A.name LIKE '%' + B.name + '%'
OR B.name LIKE '%' + A.name + '%'
)
先简单模糊匹配一下看看,看看是不是绝大部分都能匹配上。
如果绝大部分都能匹配上的话, 剩下的时候,就是写 SQL 语句,两表关联进行更新操作了。
两表关联更新例子:
http://hi.baidu.com/wangzhiqing999/blog/item/0d6aaaf780a98b42352accd4.html
SELECT
A.name AS A表名字,
B.name AS B表名字
FROM
A JOIN B
ON(
A.name LIKE '%' + B.name + '%'
OR B.name LIKE '%' + A.name + '%'
)
先简单模糊匹配一下看看,看看是不是绝大部分都能匹配上。
如果绝大部分都能匹配上的话, 剩下的时候,就是写 SQL 语句,两表关联进行更新操作了。
两表关联更新例子:
http://hi.baidu.com/wangzhiqing999/blog/item/0d6aaaf780a98b42352accd4.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
为何不再建一张表c
name_a name_b
索尼 索尼SS
索尼 索尼BB
。
a(name_a, price), b(name_b, num), c(name_a, name_b)
select a.name_a, price, sum(num) as number
from a, b, c
where a.name_a = c.name_a and c.name_b = b.name_b
group by a.name_a;
name_a name_b
索尼 索尼SS
索尼 索尼BB
。
a(name_a, price), b(name_b, num), c(name_a, name_b)
select a.name_a, price, sum(num) as number
from a, b, c
where a.name_a = c.name_a and c.name_b = b.name_b
group by a.name_a;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我刚用到这个,也是个新手,用视图比较好。
打开视图把连个表都拖进去,然后选择需要保留的列,然后定义条件。你可以选择 A.name=B.name ,然后就可以用这个视图了。
视图在程序里面调用跟表一样,但是他包涵了你这两个表的数据。
你创建视图的时候下面会出现SQL语句,通俗点,视图就是一个自带了SQL语句的表。。。。
个人看法。
打开视图把连个表都拖进去,然后选择需要保留的列,然后定义条件。你可以选择 A.name=B.name ,然后就可以用这个视图了。
视图在程序里面调用跟表一样,但是他包涵了你这两个表的数据。
你创建视图的时候下面会出现SQL语句,通俗点,视图就是一个自带了SQL语句的表。。。。
个人看法。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先说楼主的两个表结构不一样,不明白什么意思。而且('索尼',8000)('戴尔',88)价格还是数量?要输出的结果是什么不是很明确,我这里简单说一下结构一样的两个表,比如都是数量
select left(C.name,2),sum(C.num) from (select * from A union select * from B) C group by left(C.name,2)
select left(C.name,2),sum(C.num) from (select * from A union select * from B) C group by left(C.name,2)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以在查询表2的时候用模糊查询 比如 select sum(num) from B表 where name like '%索尼%' 就可以查出b表中名字中有“索尼”字段的物品的数量的和
如果是写sql语句
直接用左联 select * from 表A as a left join 表B as b on a.name='%'+b.name+'%' where 、、
后面加条件
如果是写sql语句
直接用左联 select * from 表A as a left join 表B as b on a.name='%'+b.name+'%' where 、、
后面加条件
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询