Sql 使用子查询不允许访问特定列

Sql 使用子查询不允许访问特定列,sql,sql-server,Sql,Sql Server,此问题与之前在此提出的问题相关: 在解决了上面的问题之后,我面临着一个非常类似的问题,但却完全不同。现在我有以下代码: SELECT ProductImage.Brandname, ProductImage.Description ,SubqueryAlias.* FROM ProductImage inner join ( SELECT Product.Name, Product.Description ,SubqueryAlias.* FROM Product inner join (

此问题与之前在此提出的问题相关:

在解决了上面的问题之后,我面临着一个非常类似的问题,但却完全不同。现在我有以下代码:

SELECT ProductImage.Brandname, ProductImage.Description ,SubqueryAlias.*  FROM ProductImage inner join
(
SELECT Product.Name, Product.Description ,SubqueryAlias.*  FROM Product inner join
(
-- The original query starts --
SELECT ProductId,Name as Provider FROM (
SELECT  COALESCE(ByExternalImageId.ProductId,EANProductImage.ProductId) as ProductId, COALESCE(ByExternalImageId.ProductImageProviderId,EANProductImage.ProductImageProviderId) as ProductImageProviderId FROM Product
                              LEFT JOIN
                              (
                              SELECT Product.Id as ProductId,MIN(EANProductImage.ProductImageProviderId) as ProductImageProviderId FROM Product
                                  INNER JOIN ProductImage as EANProductImage ON
                                      EANProductImage.ExternalImageId = Product.EAN
                                  INNER JOIN ProductImageAngle as EANProductImageAngle ON
                                      EANProductImage.AngleId = EANProductImageAngle.Id
                                  WHERE HasImage=1
                                  GROUP BY Product.Id
                              ) as EANProductImage ON
                                  EANProductImage.ProductId = Product.Id
                              LEFT JOIN (
                              SELECT top 1 Product.Id as ProductId,MIN(ExternalProductImage.ProductImageProviderId) as ProductImageProviderId FROM Product
                                  INNER JOIN ProductImage as ExternalProductImage ON
                                      ExternalProductImage.ExternalImageId  = Product.ExternalImageId
                                  INNER JOIN ProductImageAngle as ExternalProductImageAngle ON
                                      ExternalProductImage.AngleId = ExternalProductImageAngle.Id
                                  WHERE HasImage=1
                                  GROUP BY Product.Id
                              ) as ByExternalImageId ON
                                  ByExternalImageId.ProductId = Product.Id
                                  WHERE COALESCE(ByExternalImageId.ProductImageProviderId,EANProductImage.ProductImageProviderId) IS NOT NULL
                                  ) as images INNER JOIN ProductImageProvider ON ProductImageProvider.Id = images.ProductImageProviderId where Name='GS1'
-- The original query ends --
                                  )
AS SubqueryAlias ON SubqueryAlias.ProductID=Product.Id
)AS SubqueryAlias ON SubqueryAlias.ExternalImageId=ProductImage.ExternalImageId
我将注释置于突出显示原始查询的位置。我添加了一个子查询(
SELECT Product.Name、Product.Description、SubqueryAlias.*FROM Product internal join
)以增加两列。一切都很顺利。但是,对于第二个子查询

作为SubqueryAlias上的SubqueryAlias.ExternalImageId=ProductImage.ExternalImageId
返回一个错误,说明:

Msg 207,16级,状态1,第32行

列名“ExternalImageId”无效


这可能是因为,与其他子查询相比,
ExternalImageId
未在原始查询中声明,而,
ProductId
未声明。因为我的SQL知识有限,我真的不知道原始查询中发生了什么,尤其是不知道如何修复代码,以便通过将
dbo.ProductImage
表与
ExternalImageId
上的原始查询连接起来,获得
ProductImage.Brandname
ProductImage.Description
就像查询变得有点复杂,也许是简化了

查询的实质似乎是:

SELECT
  IM.Brandname,
  IM.Description,
  PR.Name,
  PR.Description,
  PR.ID as ProductId,
  PR.Name as Provider
FROM  
  Product PR,
  ProductImage IM,
  ProductImageAngle IA,
  ProductImageProvider PP
WHERE Name = 'GS1'
AND   ((PR.ExternalImageId = IM.ExternalImageId) OR (PR.EAN = IM.ExternalImageId))
AND   IM.AngleId = IA.ID
AND   IM.ProductImageProviderId  = PP.ID
AND   HasImage = 1
你能说说这个简化版怎么不符合要求吗

例如,它是否为每个ID返回多行,如果是,选择所需行的标准是什么

我已经看到PR.ExternalImageID比PR.EAN更受欢迎,但是很容易对业务需求中的部分以及哪些部分仅仅是由于查询语法造成的做出错误的猜测

另外,哪个表有“HasImage”字段,我猜它是ProductImageAngle,因为如果不是为了这个,似乎没有理由使用该表。但正如我所说,在代码中有很多错误猜测的空间


注意,如果查询运行很长时间,您可以将SELECT替换为SELECT TOP 100以查看前100行。

了解与错误相关的行号将非常有用<代码>外部图像ID在7条不同的行上显示10次。这一错误可能与它们中的任何一个有关。错误是否显示在第7、12、22、27、28、29或34行?否则,请提供表的DDL,以便我们至少可以复制错误。“错误发生在…”Wll,t其中一个是“明显的”;从子查询
SubqueryAlias
返回的只有两列名为
Product.Name、
ProductDescription
images.ProductID`和
images.Name
。没有列
ExternalImageId
@Questieme,您将通过重写了解更多信息,但是,您正在引用子查询的select语句中未返回的列,并且有两个子查询具有相同的属性name@Questieme我已将您的子查询名称更改为不同的名称,但是,在不知道SubqueryAlias.ExternalImageId来自何处的情况下,我们无法建议在您的select子句中为连接匹配无法工作。从我所看到的SubqueryAlias1(我已经按照先到先得的原则对它们进行了编号)只包含Product.Name、Product.Description、SubqueryAlias1.ProductId和SubqueryAlias1.Name列