2017-08-08 374 views
1

我有困难转换到下列SQL语句使用子查询:拆分SQL查询到嵌套查询(子查询)

SELECT 
    "AM-Martin".dbo.CpCore_Site.Number 
    , "AM-Martin".dbo.CpCore_Site.Latitude 
    , "AM-Martin".dbo.CpCore_Site.Longitude 
    , "AM-Martin".dbo.CpSm_Face.RetiredOn 
    , "AM-Martin_bin".dbo.CpCore_Image.Bytes 
    , "AM-Martin".dbo.CpCore_Site.Name 
    , "AM-Martin".dbo.CpCore_Site.Zipcode 
FROM 
    "AM-Martin".dbo.CpCore_Site 
    INNER JOIN "AM-Martin".dbo.CpSm_Face on "AM-Martin".dbo.CpSm_Face.SiteId = "AM-Martin".dbo.CpCore_Site.Oid 
WHERE 
    "AM-Martin".dbo.CpSm_Face.RetiredOn LIKE '%9999%' 
    AND "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LA%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LC%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%BH%' 
    AND "AM-Martin".dbo.CpCore_Site.Latitude > 0.0 
GROUP BY 
    "AM-Martin".dbo.CpCore_Site.Number 
    , "AM-Martin".dbo.CpCore_Site.Latitude 
    , "AM-Martin".dbo.CpCore_Site.Longitude 
    , "AM-Martin".dbo.CpSm_Face.RetiredOn 
    , "AM-Martin_bin".dbo.CpCore_Image.Bytes 
    , "AM-Martin".dbo.CpCore_Site.Name 
    , "AM-Martin".dbo.CpCore_Site.Zipcode; 

的图像数据类型是给我的问题在问候试图使用GROUP当我得到的错误是:

ERROR: The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator. Error Code: 306

我想出了一个解决办法看到我刚才的问题SQL Query to delete duplicate values in a 3 tables inner join with two different databases但我有图像的转换问题。

我的目标是编写一个子查询来获取主sql语句之外的图像,然后再加入图像。到目前为止,这是我:

SELECT 
    "AM-Martin_bin".dbo.CpCore_Image.Bytes 
    FROM 
    (
SELECT 
    "AM-Martin".dbo.CpCore_Site.Number 
    , "AM-Martin".dbo.CpCore_Site.Latitude 
    , "AM-Martin".dbo.CpCore_Site.Longitude 
    , "AM-Martin".dbo.CpSm_Face.RetiredOn 
    , "AM-Martin".dbo.CpCore_Site.Name 
    , "AM-Martin".dbo.CpCore_Site.Zipcode 
FROM 
    "AM-Martin".dbo.CpCore_Site 
    INNER JOIN "AM-Martin".dbo.CpSm_Face on "AM-Martin".dbo.CpSm_Face.SiteId = "AM-Martin".dbo.CpCore_Site.Oid 
WHERE 
    "AM-Martin".dbo.CpSm_Face.RetiredOn LIKE '%9999%' 
    AND "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LA%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LC%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%BH%' 
    AND "AM-Martin".dbo.CpCore_Site.Latitude > 0.0 
GROUP BY 
    "AM-Martin".dbo.CpCore_Site.Number 
    , "AM-Martin".dbo.CpCore_Site.Latitude 
    , "AM-Martin".dbo.CpCore_Site.Longitude 
    , "AM-Martin".dbo.CpSm_Face.RetiredOn 
    , "AM-Martin".dbo.CpCore_Site.Name 
    , "AM-Martin".dbo.CpCore_Site.Zipcode 
) AS a 
INNER JOIN "AM-Martin_bin".dbo.CpCore_Image on "AM-Martin".dbo.CpSm_Face.Oid = "AM-Martin_bin".dbo.CpCore_Image.OwnerId; 

当我运行此查询我得到的错误是:

ERROR: The multi-part identifier "AM-Martin.dbo.CpSm_Face.Oid" could not be bound. Error Code: 4104

任何帮助,得到这个权利,将不胜感激。

+0

您正在使用哪种RDBMS?你用postgress和SQL Server标记了它。哪一个? – SchmitzIT

+0

道歉只是修正了它,但它是SQL Server ... –

+0

你为什么使用GROUP BY?你不使用任何聚合函数。你想用GROUP BY来实现什么? – SchmitzIT

回答

1

编辑:添加所有列从

我似乎无法能再编辑我的意见,但这应该做第二个查询的伎俩:

SELECT 
    a.* 
    , "AM-Martin_bin".dbo.CpCore_Image.Bytes 
FROM 
    (
SELECT DISTINCT 
    "AM-Martin".dbo.CpCore_Site.Number 
    , "AM-Martin".dbo.CpCore_Site.Latitude 
    , "AM-Martin".dbo.CpCore_Site.Longitude 
    , "AM-Martin".dbo.CpSm_Face.RetiredOn 
    , "AM-Martin".dbo.CpCore_Site.Name 
    , "AM-Martin".dbo.CpCore_Site.Zipcode 
    , "AM-Martin".dbo.CpSm_Face.Oid 
FROM 
    "AM-Martin".dbo.CpCore_Site 
    INNER JOIN "AM-Martin".dbo.CpSm_Face on "AM-Martin".dbo.CpSm_Face.SiteId = "AM-Martin".dbo.CpCore_Site.Oid 
WHERE 
    "AM-Martin".dbo.CpSm_Face.RetiredOn LIKE '%9999%' 
    AND "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LA%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LC%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%BH%' 
    AND "AM-Martin".dbo.CpCore_Site.Latitude > 0.0 
) AS a 
INNER JOIN "AM-Martin_bin".dbo.CpCore_Image on a.Oid = "AM-Martin_bin".dbo.CpCore_Image.OwnerId; 

注意我删除了GROUP BY来自内部查询,而是添加了一个DISTINCT来摆脱可能的重复。但是,我无法测试这是否可行,因为我不知道您的数据。

出于可读性的原因,我建议您别名表,而不是重复​​零件无处不在(最初让我找到合适的列等)。

实施例:

SELECT 
    a.* 
    , b.Bytes 
FROM 
    (
SELECT DISTINCT 
    a_inner.Number 
    , a_inner.Latitude 
    , a_inner.Longitude 
    , b_inner.RetiredOn 
    , "a_inner.Name 
    , a_inner.Zipcode 
    , b_inner.Oid 
FROM 
    "AM-Martin".dbo.CpCore_Site a_inner 
    INNER JOIN "AM-Martin".dbo.CpSm_Face b_inner on b_inner.SiteId = a_inner.Oid 
WHERE 
    b_inner.RetiredOn LIKE '%9999%' 
    AND b_inner.Number LIKE N'%LA%' OR b_inner.Number LIKE N'%LC%' OR b_inner.Number LIKE N'%BH%' 
    AND b_inner.Latitude > 0.0 
) AS a 
INNER JOIN "AM-Martin_bin".dbo.CpCore_Image b on a.Oid = b.OwnerId; 

注意,我使用a_innerb_inner别名为子查询。但是,您也可以使用ab。我很想确保你能看到差异,而不是想知道列的来源。

+0

当我运行查询时,这非常有帮助,它只是在没有错误的情况下才显示出来,而现在它并没有显示我想要这样做的其他列。它只显示图像列,没有别的。我假设它与加入有关? –

+0

@JermaineSubia我的不好。试试我的更新(我刚刚在查询中添加了一个*) – SchmitzIT

+0

这实际上已经解决了,我一直在等待它完成(它耗费了很多行)我开始时看到了一些,它给了我所寻找的东西。对我来说,下一步是将查询结果导入到postgres数据库中,这就是为什么我最初将postgres标记为它在我心中的原因。非常感谢您的耐心和帮助。 –