2014-03-27 43 views
0

我试图指定两个电影的名称,并获得了一起看过那些两部电影的人数的总数,内部选择工作正常,并给出了数据库中所有电影的总体结果,但是当我试图把外部选择只指定两部电影我得到语法错误,请任何帮助?如何将查询包含到另一个查询中?

SELECT t.movie1, 
     t.movie2, 
     t.count 
FROM t 
(SELECT I.Movie movie1, 
     J.Movie movie2, 
     COUNT(I.CustomerId) count 
FROM Movies I, 
     Movies J 
WHERE I.CustomerID = J.CustomerID 
     AND I.Movie < J.Movie 
GROUP BY I.Movie, 
      J.Movie 
HAVING COUNT(I.CustomerID) >= 150) as t 
WHERE movie1 LIKE 'Star Wars Episode II: Attack of the Clones' 
     AND movie2 LIKE 'Star Wars Episode V: Empire Strikes Back'; 

回答

0

不要指定别名两次;您在将内部查询标识为t之前从t中选择。

SELECT t.movie1 
     , t.movie2 
     , t.count 
FROM (SELECT I.Movie movie1 
        , J.Movie movie2 
        , COUNT(I.CustomerId) count 
      FROM  Movies I 
        JOIN Movies J ON I.CustomerID = J.CustomerID 
            AND I.Movie < J.Movie 
      GROUP BY I.Movie 
        , J.Movie 
      HAVING COUNT(I.CustomerID) >= 150 
     ) AS t 
WHERE movie1 LIKE 'Star Wars Episode II: Attack of the Clones' 
     AND movie2 LIKE 'Star Wars Episode V: Empire Strikes Back'; 
+0

但像他这样的计数为零,它应该是175 –

+0

不应该有任何根本性的分歧;我只是喜欢JOIN语法。语法错误的主要原因是“t”别名的双重放置;如果你愿意的话,保持原有的内部查询,并修正别名问题。 –

0

您的内部查询很好,但实际上并没有在外部查询中指定一个表。想象这一点的最好方法是想象括号内的所有内容都是表名。这里是你所写的内容:

SELECT t.movie1, 
     t.movie2, 
     t.count 
FROM t 
t as t 
WHERE movie1 LIKE 'Star Wars Episode II: Attack of the Clones' 
     AND movie2 LIKE 'Star Wars Episode V: Empire Strikes Back'; 

有时当你疲于应付加入这样更容易向上突破您的查询,使用#tmp表的两个查询。

DECLARE @MovieName1 VARCHAR(500) 
DECLARE @MovieName2 VARCHAR(500) 
SET @MovieName1 = 'IT' 
SET @MovieName2 = 'The Fly' 

SELECT 
    a.CustomerID, 
INTO 
    #Movie1Users 
FROM 
    Movies a 
WHERE a.MovieName = @MovieName1 

SELECT 
    a.customerID, 
    @MovieName1, 
    @MovieName2, 
    COUNT(*) AS CustomerCount 
FROM 
    Movies a 
    INNER JOIN #Movie1Users b ON a.customerID = b.CustomerID 
WHERE 
    a.MovieName = @MovieName2 

Drop table #Movie1Users 

然后,它变得很容易看到这将如何作为一个查询。 (我宁愿保持内部查询别名不同以避免混淆)。希望我的下面的语法能帮助你解决将来的问题。

DECLARE @MovieName1 VARCHAR(500) 
DECLARE @MovieName2 VARCHAR(500) 
SET @MovieName1 = 'IT' 
SET @MovieName2 = 'The Fly' 

SELECT 
    @MovieName1, 
    @MovieName2, 
    COUNT(*) AS CustomerCount 
FROM 
    Movies a 
    INNER JOIN (
     SELECT 
      z.CustomerID 
     FROM 
      Movies z 
     WHERE z.MovieName = @MovieName1 
    ) b ON a.customerID = b.CustomerID 
WHERE 
    a.MovieName = @MovieName2 

最后就可以写你的查询,而无需一个子查询:

DECLARE @MovieName1 VARCHAR(500) 
DECLARE @MovieName2 VARCHAR(500) 
SET @MovieName1 = 'IT' 
SET @MovieName2 = 'The Fly' 

SELECT 
    @MovieName1 AS Movie1, 
    @MovieName2 AS Movie2, 
    (COUNT(*)/2) AS CustomerCount 
FROM dbo.Movies a 
INNER JOIN movies b ON a.CustomerID = b.CustomerID 
WHERE 
    (a.MovieName = @MovieName1 AND b.MovieName = @MovieName2) 
    OR (a.MovieName = @MovieName2 AND b.MovieName = @MovieName1) 
GROUP BY a.CustomerID 
相关问题