【问题标题】:SQL Query to delete duplicate values in a 3 tables inner join with two different databasesSQL Query 删除与两个不同数据库的 3 个表内部连接中的重复值
【发布时间】:2017-08-07 04:23:54
【问题描述】:

我正在使用 SQL Server 数据库,并且我编写了以下查询:

SELECT 
    "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, "AM-Martin".dbo.CpCore_Site.Number
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
INNER JOIN 
    "AM-Martin_bin".dbo.CpCore_Image on "AM-Martin".dbo.CpSm_Face.Oid = "AM-Martin_bin".dbo.CpCore_Image.OwnerId
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;

查询返回我需要的数据,但它复制了一些数据。当我尝试添加Distinct 以消除重复数据时...

SELECT DISTINCT 
    "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, "AM-Martin".dbo.CpCore_Site.Number
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
INNER JOIN 
    "AM-Martin_bin".dbo.CpCore_Image on "AM-Martin".dbo.CpSm_Face.Oid = "AM-Martin_bin".dbo.CpCore_Image.OwnerId
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;

它不允许我使用它,因为这个列"AM-Martin_bin".dbo.CpCore_Image.Bytes这个列是实际的图像数据。我得到的错误信息是:

错误:图像数据类型无法选择为 DISTINCT,因为它不可比较。错误代码:421

我正在尝试删除所有重复数据。要访问数据库,我使用的是 RazorSQL,远程数据库是使用 SQL Server 的 Microsoft Server 2008。

更新

我使用了 GROUP BY,它看起来像这样:

SELECT 
    "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, "AM-Martin".dbo.CpCore_Site.Number
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
INNER JOIN "AM-Martin_bin".dbo.CpCore_Image on "AM-Martin".dbo.CpSm_Face.Oid = "AM-Martin_bin".dbo.CpCore_Image.OwnerId

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.Name;

现在我收到以下错误:

错误:列“AM-Martin.dbo.CpCore_Site.Latitude”在 选择列表,因为它不包含在任一聚合中 函数或 GROUP BY 子句。错误代码:8120

现在,如果我向组中添加更多列,它会一直对下一列说同样的话,直到我到达 "AM-Martin_bin".dbo.CpCore_Image.Bytes我收到以下错误消息:

错误:无法比较 text、ntext 和 image 数据类型或 已排序,除非使用 IS NULL 或 LIKE 运算符。错误代码:306

【问题讨论】:

  • 在右列上使用GROUP BY 而不是 DISTINCT?
  • 尝试使用correlated subqueryselect 语句中投影该图像列,或者使用oracle ROW_NUMBER() 中的一些分析函数从重复项中获取一条记录。
  • 我更新了我的问题以反映您的建议@Myonara

标签: sql sql-server database sql-server-2008


【解决方案1】:

感谢group by clause is not working with Image,我想通了,我所要做的就是通过像这样将其转换为 VARBINARY 来添加更改图像列的措辞:

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,**CAST("AM-Martin_bin".dbo.CpCore_Image.Bytes as Varbinary)**, "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
INNER JOIN "AM-Martin_bin".dbo.CpCore_Image on "AM-Martin".dbo.CpSm_Face.Oid = "AM-Martin_bin".dbo.CpCore_Image.OwnerId

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,**CAST("AM-Martin_bin".dbo.CpCore_Image.Bytes as Varbinary)**, "AM-Martin".dbo.CpCore_Site.Name, "AM-Martin".dbo.CpCore_Site.Zipcode;

我还必须感谢 @Myonara 让我通过建议在小组中走上正轨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2020-08-11
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多