2013-07-26 60 views
0

我试图在MS Access中执行以下SQL。是否有可能在JOIN中有子查询过滤器

基本上TAB3用作转换表

SELECT * 
FROM TAB1 T1 INNER JOIN TAB2 T2 
ON T1.MemNo = T2.MemID 
AND (T1.SID = (SELECT x.Col1 FROM TAB3 x WHERE x.Col2 = T2.SVID)) 

但它给了我一个语法错误

可能是什么可能的问题

更新:

TAB1 

MemNo SID 

116537 S110 
116537 D011 
575788 D012 
214438 S110 
434675 D114 
214438 D011 
208368 D012 
208368 S110 

TAB2 

MemID SVID 

116537 110 
116537 11 
214438 11 
434675 114 
214438 110 
575788 12 
208368 12 
208368 110 


TAB3 

Col1 Col2 

D011 11 
S110 110 
D114 114 
D012 12 

感谢

+1

是否语法错误指定的任何信息 - 错误号码等?也许其中一个数字列是文本而不是数字? – AngelWarrior

回答

2

为什么不子查询移动到您的查询的WHERE语句?

SELECT * 
FROM TAB1 T1 
INNER JOIN TAB2 T2 ON T1.MemNo = T2.MemID 
WHERE EXISTS (SELECT 1 
       FROM TAB3 x 
       WHERE x.Col2 = T2.SVID 
       AND x.Col1 = T1.SID) 

尝试使用LEFT以下连接:

SELECT * 
FROM TAB1 T1 
LEFT JOIN TAB2 T2 ON T1.MemNo = T2.MemID 
WHERE EXISTS (SELECT 1 
       FROM TAB3 x 
       WHERE x.Col2 = COALESCE(T2.SVID, x.Col2) 
       AND x.Col1 = T1.SID) 
+0

欣赏您的回复。以上解决方案执行时没有语法错误,但没有结果。 – SMPH

+0

@Manthree Peiris使用您的示例数据我确实得到了结果:[链接](http://www.sqlfiddle.com/#!3/18771/1) – Sam

+0

对不起,山姆,你说得对。我的桌子上有我的列交换。谢谢 – SMPH

2

尝试用存在:

SELECT * 
FROM TAB1 T1 INNER JOIN TAB2 T2 
ON T1.MemNo = T2.MemID 
WHERE EXISTS (SELECT * FROM TAB3 x WHERE x.Col2 = T2.SVID AND x.Col1 = T1.SID) 
+0

感谢您的回复。上面的查询给出相同的语法错误,虽然 – SMPH

+0

感谢gzaxx,这也工作后用'WHERE'替换'AND'。赞赏 – SMPH

0
SELECT * 
FROM TAB1 T1 INNER JOIN TAB2 T2 
ON T1.MemNo = T2.MemID 
AND (T1.SID in (SELECT x.Col1 FROM TAB3 x WHERE x.Col2 = T2.SVID)) 
+0

@Raveen,谢谢你的回应。以上查询给出相同的语法错误 – SMPH

相关问题