2010-05-11 47 views
0
SELECT ['VISA CK - 021810$'].[ACCT NBR  #1], ['VISA CK - 021810$'].[ALT CUST NM #1], ['VISA CK - 021810$'].[LAST USED] 
FROM ['VISA CK - 021810$'] 
WHERE ['VISA CK - 021810$'].[ALT CUST NM #1] 
    IN (
     SELECT ['VISA CK - 021810$'].[ALT CUST NM #1] 
     FROM ['VISA CK - 021810$'] 
     GROUP BY ['VISA CK - 021810$'].[ALT CUST NM #1] 
      HAVING COUNT(['VISA CK - 021810$'].[ALT CUST NM #1]) > 1 
     ) 
    AND ['VISA CK - 021810$'].[ACCT NBR  #1] 
    IN (
     SELECT ['VISA CK - 021810$'].[ACCT NBR  #1] 
     FROM ['VISA CK - 021810$'] 
     GROUP BY ['VISA CK - 021810$'].[ACCT NBR  #1] 
      HAVING COUNT(['VISA CK - 021810$'].[ACCT NBR  #1]) > 1 
     ) 
+7

像这样的列名应该是非法的:) – 2010-05-11 19:11:49

+0

看起来像它会,但我同意尼克,它肯定是痛苦的阅读。当你尝试过它发生了什么? – MJB 2010-05-11 19:13:21

+0

约定!从另一个应用程序导入.csv的结果... – TheDudeAbides 2010-05-11 19:13:36

回答

0

使用改写联接:

SELECT t.[ACCT NBR  #1], 
     t.[ALT CUST NM #1], 
     t.[LAST USED] 
    FROM ['VISA CK - 021810$'] t 
    JOIN (SELECT ['VISA CK - 021810$'].[ALT CUST NM #1] 
      FROM ['VISA CK - 021810$'] 
     GROUP BY ['VISA CK - 021810$'].[ALT CUST NM #1] 
     HAVING COUNT(['VISA CK - 021810$'].[ALT CUST NM #1]) > 1) x ON x.[ALT CUST NM #1] = t.[ALT CUST NM #1] 
    JOIN (SELECT ['VISA CK - 021810$'].[ACCT NBR  #1] 
      FROM ['VISA CK - 021810$'] 
     GROUP BY ['VISA CK - 021810$'].[ACCT NBR  #1] 
     HAVING COUNT(['VISA CK - 021810$'].[ACCT NBR  #1]) > 1) y ON y.[ACCT NBR  #1] = t.[ACCT NBR  #1] 

确保它返回你所期望的数据 - 后调。假设你提供的查询是正确的,JOIN通常比子查询更受欢迎,但审查和比较执行计划会告诉你什么是最适合你的情况。

0

这是一个有效的SQL结构,但我们无法评论它是否有效。

你的意思是:在['VISA CK - 021810$']每一行,返回该行,如果我找到他们相对都[ACCT NBR #1][ALT CUST NM #1] IN子句

0

是的,它会返回良好的数据匹配。 WHERE子句将确保在使用AND时返回任何数据之前,两个IN子句都受到尊重。

+0

这是我第一次用AND来使用多个IN。谢谢你澄清。 – TheDudeAbides 2010-05-11 19:16:54