您的内部查询很好,但实际上并没有在外部查询中指定一个表。想象这一点的最好方法是想象括号内的所有内容都是表名。这里是你所写的内容:
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
但像他这样的计数为零,它应该是175 –
不应该有任何根本性的分歧;我只是喜欢JOIN语法。语法错误的主要原因是“t”别名的双重放置;如果你愿意的话,保持原有的内部查询,并修正别名问题。 –