您的位置:首页 > 数据库

SQL查询题解的典型应用

2007-08-20 12:58 471 查看
有三個表的結構和記錄如下:
tableA
ID RID FID
===============
1 R123 123
2 R0 456
3 R11 789

tableB
ID FID
========
1 12
2 123
3 789

tableC
ID PID
========
1 R11
2 123,R0,33
3 R0,12

求一高效的SQL語句或存儲過程實現:當tableC中PID號即不存在於tableA的RID也不存在於tablcB中FID中時,將此記錄篩選出來。tablcC中的PID字段可以存儲一個或多個RID或FID號

比如,上述中要將tableC表中的ID為2的記錄篩選出來,因為PID中33是不存在的

tablcA現有幾千條記錄
tablcB現有三萬多條記錄 此表為VFP DBF數據表,現已做了個鏈接服務器,將它挂到SQL SERVER中,可以當普通SQL SERVER數據表查詢使用,不過查詢速度有點慢
tablcC現有上萬條記錄

CREATE TABLE ta(ID INT,RID VARCHAR(10),FID VARCHAR(10))


INSERT Ta SELECT 1, 'R123', '123'


UNION ALL SELECT 2, 'R0' , '456'


UNION ALL SELECT 3, 'R11' , '789'


CREATE TABLE tb(ID INT,FID VARCHAR(10))


INSERT Tb SELECT 1,12


UNION ALL SELECT 2,123


UNION ALL SELECT 3,789


CREATE TABLE tc(ID INT,PID VARCHAR(100))


INSERT Tc SELECT 1, 'R11'


UNION ALL SELECT 2, '123,R0,33'


UNION ALL SELECT 3, 'R0,12'




SELECT c.*,COUNT(*) CNT FROM tc c


INNER JOIN


(SELECT RID FROM Ta


UNION


SELECT FID FROM tb) x


ON CHARINDEX(','+x.RID+',',','+c.PID+',')>0


GROUP BY ID,PID


HAVING COUNT(*)<>LEN(REPLACE(PID,',',',,'))-LEN(PID)+1




DROP TABLE ta,tb,tc
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: