發信人: leezile (樂·ISEE.DK0201 FOREVER), 板面: Database
標 題: 問一道面試題。數據庫方面
發信站: 飄渺水雲間 (Sun May 27 23:42:44 2007), 轉信
數據庫中表的內容爲:(KeyName, KeyValue是主鍵)
ID KeyName KeyValue
1 A 1
1 A 2
1 B 2
1 C 3
2 A 1
2 B 2
2 C 3
4 A 1
4 B 2
5 A 1
6 B 2
要求輸入<KeyName, KeyValue>[],是KeyName和Value匹配對的數組,
得到查詢結果爲具有這些數組對的ID。
如:
輸入(KeyName, KeyValue)
A 1
B 2
結果(ID)
1
2
4
寫SQL語句。
PS:我可以把輸入存成臨時表,然後要怎麼用呢?
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[ShowId]
(
@inputString varchar(max)
)
AS
DECLARE @PointerPrev int
DECLARE @PointerCurr int
DECLARE @spaceIndex int
DECLARE @subString varchar(50)
DECLARE @keyWord varchar(50)
DECLARE @value int
Set @PointerPrev=0
set @PointerCurr=0
--SET @inputString = 'A,1;B,2'
CREATE TABLE #temp
(
name varchar(50),
value int
)
begin transaction
SET NOCOUNT ON;
truncate table #temp--清空臨時表的所有數據和約束
while(LEN(@inputString)>@PointerCurr)
begin
Set @PointerCurr=CharIndex (';',@inputString ,@PointerPrev+1)
if(@PointerCurr<=0)
break
else
begin
set @subString=SUBSTRING(@inputString,@PointerPrev+1 ,@PointerCurr-@PointerPrev-1)
set @spaceIndex=CharIndex (',',@subString ,1)
set @keyWord=SUBSTRING(@subString,1,@spaceIndex-1)
set @value=CAST( SUBSTRING(@subString,@spaceIndex+1,LEN(@subString)-@spaceIndex) as int)
INSERT INTO #temp VALUES(@keyWord,@value)
set @PointerPrev=@PointerCurr;
end
end
set @subString=SUBSTRING(@inputString,@PointerPrev+1 ,LEN(@inputString)-@PointerPrev)
set @spaceIndex=CharIndex (',',@subString ,1)
set @keyWord=SUBSTRING(@subString,1,@spaceIndex-1)
set @value=CAST( SUBSTRING(@subString,@spaceIndex+1,LEN(@subString)-@spaceIndex) as int)
INSERT INTO #temp VALUES(@keyWord,@value)
Set NoCount OFF
if @@error= 0
begin
commit transaction
end
else
begin
rollback transaction
end
----------------------------這裏開始進入正題
select distinct id from dbo.Key_Value kv
where not exists
(
select name,value from #temp
except
select Keyword,value from dbo.Key_Value where id=kv.id
);
select name,value from #temp
except
select Keyword,value from dbo.Key_Value where id=5
結果爲:
name value
-------------------------------------------------- -----------
B 2