34,876
社区成员
发帖
与我相关
我的任务
分享-- SQL 2005或之后的版本(之前的版本得写函数啦)
SELECT
t2.KEYWORD_EN,
B.INFORMATION_ID
FROM t2
CROSS APPLY(
SELECT INFORMATION_ID = STUFF(
(
SELECT
- = ',' + RTRIM
- (INFORMATION_ID)
FROM t1
WHERE t2.AUTOID = t1.TAB_KEYWORD_DICTIONARY_ID
FOR XML PATH(''), TYPE
).value('/', 'varchar(8000)'),
1, 1, '')
)B
create table [t1] (AUTOID int,INFORMATION_ID int,TAB_KEYWORD_DICTIONARY_ID int)
insert into [t1]
select 1,2,1 union all
select 2,4,1 union all
select 3,6,2
create table [t2] (AUTOID int,KEYWORD varchar(4),KEYWORD_EN varchar(2))
insert into [t2]
select 1,'中国','zg' union all
select 2,'欢迎','hy'
go
select t2.KEYWORD_EN , n.INFORMATION_ID from t2,
(select TAB_KEYWORD_DICTIONARY_ID, [INFORMATION_ID]=stuff((select ','+cast(INFORMATION_ID as varchar) from t1 t where TAB_KEYWORD_DICTIONARY_ID=t1.TAB_KEYWORD_DICTIONARY_ID for xml path('')), 1, 1, '') from t1 group by TAB_KEYWORD_DICTIONARY_ID) n
where t2.autoid = n.TAB_KEYWORD_DICTIONARY_ID
drop table t1,t2
/*
KEYWORD_EN INFORMATION_ID
---------- --------------
zg 2,4
hy 6
(2 行受影响)
*/
create table [t1] (AUTOID int,INFORMATION_ID int,TAB_KEYWORD_DICTIONARY_ID int)
insert into [t1]
select 1,2,1 union all
select 2,4,1 union all
select 3,6,2
create table [t2] (AUTOID int,KEYWORD varchar(4),KEYWORD_EN varchar(2))
insert into [t2]
select 1,'中国','zg' union all
select 2,'欢迎','hy'
go
--创建一个合并的函数
create function f_hb(@TAB_KEYWORD_DICTIONARY_ID int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(INFORMATION_ID as varchar) from t1 where TAB_KEYWORD_DICTIONARY_ID = @TAB_KEYWORD_DICTIONARY_ID
set @str = right(@str , len(@str) - 1)
return(@str)
End
go
--调用自定义函数得到结果:
select t2.KEYWORD_EN , n.INFORMATION_ID from t2,
(select distinct TAB_KEYWORD_DICTIONARY_ID ,dbo.f_hb(TAB_KEYWORD_DICTIONARY_ID ) as INFORMATION_ID from t1) n
where t2.AUTOID = n.TAB_KEYWORD_DICTIONARY_ID
drop table t1,t2
drop function dbo.f_hb
/*
KEYWORD_EN INFORMATION_ID
---------- --------------
zg 2,4
hy 6
(所影响的行数为 2 行)
*/create table [t1] (AUTOID int,INFORMATION_ID int,TAB_KEYWORD_DICTIONARY_ID int)
insert into [t1]
select 1,2,1 union all
select 2,4,1 union all
select 3,6,2 union all
select 4,7,1
create table [t2] (AUTOID int,KEYWORD varchar(4),KEYWORD_EN varchar(2))
insert into [t2]
select 1,'中国','zg' union all
select 2,'欢迎','hy'
create table [t3] (AUTOID int,INFO_ID int,ORDER_ID int,TOP_ORDER_ID int)
insert into t3 values(1 , 4 , 4 , -1 )
insert into t3 values(2 , 6 , 5 , -1 )
insert into t3 values(3 , 7 , 2 , -1 )
insert into t3 values(4 , 2 , 1 , 5 )
go
SELECT
t2.KEYWORD_EN,
B.INFORMATION_ID
FROM t2
CROSS APPLY(
SELECT INFORMATION_ID = STUFF(
(
SELECT
- = ',' + RTRIM
- (t1.INFORMATION_ID)
FROM t1 ,t3
WHERE t1.INFORMATION_ID = t3. INFO_ID and t2.AUTOID = t1.TAB_KEYWORD_DICTIONARY_ID
order by t3.TOP_ORDER_ID desc, ORDER_ID desc
FOR XML PATH(''), TYPE
).value('/', 'varchar(8000)'),
1, 1, '')
)B
drop table t1,t2,t3
/*
KEYWORD_EN INFORMATION_ID
---------- -----------------
zg 2,4,7
hy 6
(2 行受影响)
*/
create table [t1] (AUTOID int,INFORMATION_ID int,TAB_KEYWORD_DICTIONARY_ID int)
insert into [t1]
select 1,2,1 union all
select 2,4,1 union all
select 3,6,2 union all
select 4,7,1
create table [t2] (AUTOID int,KEYWORD varchar(4),KEYWORD_EN varchar(2))
insert into [t2]
select 1,'中国','zg' union all
select 2,'欢迎','hy'
create table [t3] (AUTOID int,INFO_ID int,ORDER_ID int,TOP_ORDER_ID int)
insert into t3 values(1 , 4 , 4 , -1 )
insert into t3 values(2 , 6 , 5 , -1 )
insert into t3 values(3 , 7 , 2 , -1 )
insert into t3 values(4 , 2 , 1 , 5 )
go
SELECT
t2.KEYWORD_EN,
B.INFORMATION_ID
FROM t2
CROSS APPLY(
SELECT INFORMATION_ID = STUFF(
(
SELECT
- = ',' + RTRIM
- (t1.INFORMATION_ID)
FROM t1 ,t3
WHERE t1.AUTOID = t3.AUTOID and t2.AUTOID = t1.TAB_KEYWORD_DICTIONARY_ID
order by TOP_ORDER_ID desc, ORDER_ID desc
FOR XML PATH(''), TYPE
).value('/', 'varchar(8000)'),
1, 1, '')
)B
drop table t1,t2,t3
/*
KEYWORD_EN INFORMATION_ID
---------- -----------------
zg 7,4,2
hy 6
(2 行受影响)
*/
CREATE TABLE T1(AUTOID INT, INFORMATION_ID INT, TAB_KEYWORD_DICTIONARY_ID INT)
INSERT T1
SELECT 1, 2, 1 UNION ALL
SELECT 2, 4, 1 UNION ALL
SELECT 3, 6, 2 UNION ALL
SELECT 3, 7, 1
CREATE TABLE T2(AUTOID INT, KEYWORD NVARCHAR(10), KEYWORD_EN VARCHAR(10))
INSERT T2
SELECT 1, N'中国', 'zg' UNION ALL
SELECT 2, N'欢迎', 'hy' UNION ALL
SELECT 3, N'测试', 'cs'
CREATE TABLE T3(AUTO_ID INT, INFO_ID INT, ORDER_ID INT, TOP_ORDER_ID INT)
INSERT T3
SELECT 1, 4, 4, -1 UNION ALL
SELECT 2, 6, 5, -1 UNION ALL
SELECT 3, 7, 2, -1 UNION ALL
SELECT 4, 2, 1, 5
SELECT INFORMATION_ID,KEYWORD_EN INTO T4
FROM T1 JOIN T2 ON T2.AUTOID=TAB_KEYWORD_DICTIONARY_ID JOIN T3 ON INFO_ID=INFORMATION_ID
ORDER BY KEYWORD_EN,TOP_ORDER_ID desc, ORDER_ID desc
GO
CREATE FUNCTION GetString(@KEYWORD_EN VARCHAR(10))
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @SQL VARCHAR(100)
SET @SQL=''
SELECT @SQL=@SQL+','+RTRIM(INFORMATION_ID) FROM T4 WHERE KEYWORD_EN=@KEYWORD_EN
RETURN STUFF(@SQL,1,1,'')
END
GO
SELECT KEYWORD_EN,INFORMATION_ID=dbo.GetString(KEYWORD_EN) FROM T4 GROUP BY KEYWORD_EN
DROP TABLE T1
DROP TABLE T2
DROP TABLE T3
DROP TABLE T4
DROP FUNCTION GetString
/*
KEYWORD_EN INFORMATION_ID
---------- ----------------------------------------------------------------------------------------------------
hy 6
zg 2,4,7
*/
SELECT
t2.KEYWORD_EN,
B.INFORMATION_ID
FROM TAB_KEYWORD_DICTIONARY t2
CROSS APPLY(
SELECT INFORMATION_ID = STUFF(
(
SELECT
- = ',' + RTRIM
- (INFORMATION_ID)
FROM TAB_INFORMATION_KEYWORD t1
WHERE t2.AUTOID = t1.TAB_KEYWORD_DICTIONARY_ID
order by TOP_ORDER_ID desc, ORDER_ID desc
FOR XML PATH(''), TYPE
).value('/', 'varchar(8000)'),
1, 1, '')
)B
WHERE B.INFORMATION_ID IS NOT NULL