作者:清新之乄风666 | 来源:互联网 | 2023-09-14 16:49
有三個表的結構和記錄如下:
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