将SQL查询拆分为嵌套查询(子查询)

时间:2017-08-08 05:39:29

标签: sql-server database

我无法将以下内容转换为带有子查询的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 BY的问题我得到的错误是:

  

错误:无法比较text,ntext和image数据类型   排序,除非使用IS NULL或LIKE运算符。错误代码: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;

运行此查询时出现的错误是:

  

错误:多部分标识符" AM-Martin.dbo.CpSm_Face.Oid"可以   不受约束。错误代码:4104

任何帮助实现这一目标的人都将不胜感激。

1 个答案:

答案 0 :(得分: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以消除可能的重复项。但是,我无法测试这是否有效,因为我不知道您的数据。

为了便于阅读,我建议您为表格添加别名,而不是在任何地方重复"AM-MARTIN".dbo.<tablename>部分(最初会让我失去关于找到合适的列等等)。

示例:

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。我真的很想确保你看到差异,而不是想知道列的来源。