0

为什么这是错误的,我该如何纠正?

SELECT     PublicationID
FROM         (SELECT DISTINCT pat.PublicationID
                       FROM          dbo.PubAdvTransData AS pat INNER JOIN
                                          dbo.PubAdvertiser AS pa ON pat.AdvTransID =   pa.AdvTransID
                       WHERE      (pat.LastAdDate > '7 / 1 / 2009') AND (pat.PublicationID = 29171)) AS table1
UNION
SELECT     PublicationAreaBuy.AreaBuyID AS PublicationID
FROM         PublicationAreaBuy INNER JOIN
                      table1 AS table1_1 ON table1.publicationID =     PublicationAreaBuy.PublicationID

错误是 table1 是无效对象。

谢谢。

4

5 回答 5

7

你有一个范围问题。联合组合了两个单独的查询。因此,如果您将查询分开:

SELECT PublicationID
FROM ( SELECT DISTINCT pat.PublicationID
       FROM dbo.PubAdvTransData AS pat 
       INNER JOIN dbo.PubAdvertiser AS pa 
         ON pat.AdvTransID =   pa.AdvTransID
       WHERE (pat.LastAdDate > '7 / 1 / 2009') AND (pat.PublicationID = 29171)
     ) AS table1



SELECT PublicationAreaBuy.AreaBuyID AS PublicationID
FROM PublicationAreaBuy 
INNER JOIN table1 AS table1_1 
  ON table1.publicationID = PublicationAreaBuy.PublicationID

您可以看到在第二个查询中没有 table1 之类的东西。还有其他几种方法可以完成您正在尝试做的事情:

  • 重复子查询(丑陋)
  • 使用公用表表达式(仅当这是 T-SQL 时)
  • 使用#temporary @table(同样,我只知道如何在 T-SQL 中执行此操作)

如果我们要复制子查询,它看起来像这样。但是,顶部查询没有条件,因此它不需要是子查询:

SELECT DISTINCT pat.PublicationID
FROM dbo.PubAdvTransData AS pat 
INNER JOIN dbo.PubAdvertiser AS pa 
   ON pat.AdvTransID =   pa.AdvTransID
WHERE (pat.LastAdDate > '7 / 1 / 2009') AND (pat.PublicationID = 29171)


UNION

SELECT PublicationAreaBuy.AreaBuyID AS PublicationID
FROM PublicationAreaBuy 
INNER JOIN ( SELECT DISTINCT pat.PublicationID
       FROM dbo.PubAdvTransData AS pat 
       INNER JOIN dbo.PubAdvertiser AS pa 
         ON pat.AdvTransID =   pa.AdvTransID
       WHERE (pat.LastAdDate > '7 / 1 / 2009') AND (pat.PublicationID = 29171)
     ) AS table1 
  ON table1.publicationID = PublicationAreaBuy.PublicationID
于 2009-07-08T21:07:37.873 回答
1

嗯..是的。

即使结果通过联合连接在一起,这两个 select 语句也彼此不同。

您使用的是什么 SQL 服务器,包括版本?

于 2009-07-08T21:06:38.280 回答
1

AFAIK,您不能从另一个查询中引用一个查询。您联合在一起的两个查询必须是独立且不同的。

当您考虑这一点时,这是有道理的,因为联合实际上所做的只是将两个查询的输出串行拼接在一起。

于 2009-07-08T21:10:06.697 回答
1

您可以使用临时表,但我觉得可能有更好的方法。在不知道您的数据库架构或您要达到的目标的情况下,很难推荐其他任何东西。

CREATE TABLE #temp
(
    PublicationID int
)

SELECT DISTINCT INTO #temp pat.PublicationID
                  FROM dbo.PubAdvTransData AS pat 
                  INNER JOIN dbo.PubAdvertiser AS pa ON pat.AdvTransID = pa.AdvTransID
                  WHERE (pat.LastAdDate > '7 / 1 / 2009') AND (pat.PublicationID = 29171)

    SELECT PublicationID
    FROM   #temp
    UNION
    SELECT PublicationAreaBuy.AreaBuyID AS PublicationID
    FROM   PublicationAreaBuy 
    INNER JOIN #temp As Table1 ON Table1.PublicationID = PublicationAreaBuy.PublicationID

免责声明:我快速手动输入此内容,因此请在运行前检查语法错误。

于 2009-07-08T21:18:26.603 回答
0

尝试使用 CTE 而不是您的第一个查询

WITH MyCTE AS 
(
    SELECT DISTINCT pat.PublicationID
    FROM   dbo.PubAdvTransData AS pat 
        INNER JOIN dbo.PubAdvertiser AS pa ON pat.AdvTransID = pa.AdvTransID
    WHERE (pat.LastAdDate > '7 / 1 / 2009') AND (pat.PublicationID = 29171)
)
SELECT PublicationAreaBuy.AreaBuyID AS PublicationID
FROM   PublicationAreaBuy 
    INNER JOIN MyCTE ON MyCTE.publicationID = PublicationAreaBuy.PublicationID 
于 2009-07-08T21:13:17.360 回答