SQL:需要删除包含多个连接的查询中的重复行

标签 sql

请注意,我是一个完整的 SQL noob 并且正在学习中。基于谷歌搜索(包括在此处搜索),我尝试使用 SELECT DISTINCT 和 GROUP BY 但都不起作用,可能是由于我的所有连接(如果有人知道为什么它们不能完全工作,那将有助于学习)。

我需要来自各种表格的数据,下面是我知道的唯一方法(我只知道基础知识)。下面的查询工作正常,但显示重复。我需要知道如何删除这些。我现在唯一的提示可能是嵌套的 SELECT 查询,但根据研究,我不确定如何实现它们。任何帮助都会很棒,谢谢!

USE SQL_Contest
go
SELECT
    CLT.Description AS ClockType,
    CLK.SerialNumber AS JobClockSerial,
    SIT.SiteNumber AS JobID,
    SIT.[Name] AS JobsiteName,
    SIT.Status AS SiteActivityStatus,
    DHA.IssuedDate AS DHAIssuedDate, -- Date the clock was assigned to THAT jobsite
    CLK.CreatedDate AS CLKCreatedDate, -- Date clock first was assigned to ANY jobsite
    SES.ClockVoltage
FROM tb_Clock CLK
INNER JOIN tb_ClockType CLT
ON CLK.TypeID = CLT.ClockTypeID
INNER JOIN tb_DeviceHolderActivity DHA
ON CLK.ClockGUID = DHA.DeviceGUID
INNER JOIN tb_Site SIT
ON SIT.SiteGUID = DHA.HolderGUID
LEFT JOIN tb_Session SES
ON SES.ClockSerialNumber = CLK.SerialNumber
WHERE DHA.ReturnedDate IS NULL
ORDER BY SIT.[Name] ASC

编辑:我将很快审查这些答案,非常感谢。我根据 Rob 的要求发布了额外的重复信息:

一切都显示正常,直到我添加:
LEFT JOIN tb_Session SES
ON SES.ClockSerialNumber = CLK.SerialNumber

我需要的。那是出现重复的时候:
JobClock 2,500248E4,08-107,Brentwood Job,1,2007-05-04 13:36:54.000,2007-05-04 13:47:55.407,3049    
JobClock 2,500248E4,08-107,Brentwood Job,1,2007-05-04 13:36:54.000,2007-05-04 13:47:55.407,3049

我希望该信息只显示一次。本质上,此查询是确定所有分配有时钟的事件工地,并且该作业仅分配了一个时钟,并且它只有一个工地,但它出现了两次。

编辑 2:根据你们提供的帮助,我能够确定它们实际上不是重复的,并且每个 session 都是独立的,这是唯一一个碰巧有两个 session 的 session 。所以现在我将尝试弄清楚如何只从最新 session 中提取信息。

最佳答案

如果一切“正常”,直到您添加:

LEFT JOIN tb_Session SES
ON SES.ClockSerialNumber = CLK.SerialNumber

那么tb_Session中肯定有不止一条记录对于每个 CLK.SerialNumber。

运行以下查询:
SELECT  *
FROM    tb_Session SES
WHERE   ClockSerialNumber = '08-107'

应该返回两条记录。你需要决定如何处理这个(即你想使用哪个记录?),除非来自 tb_Session 的两行包含相同的数据,在这种情况下,应该吗?

您可以随时将查询更改为:
SELECT
    CLT.Description AS ClockType,
    CLK.SerialNumber AS JobClockSerial,
    SIT.SiteNumber AS JobID,
    SIT.[Name] AS JobsiteName,
    SIT.Status AS SiteActivityStatus,
    DHA.IssuedDate AS DHAIssuedDate, -- Date the clock was assigned to THAT jobsite
    CLK.CreatedDate AS CLKCreatedDate, -- Date clock first was assigned to ANY jobsite
    SES.ClockVoltage
FROM tb_Clock CLK
INNER JOIN tb_ClockType CLT
ON CLK.TypeID = CLT.ClockTypeID
INNER JOIN tb_DeviceHolderActivity DHA
ON CLK.ClockGUID = DHA.DeviceGUID
INNER JOIN tb_Site SIT
ON SIT.SiteGUID = DHA.HolderGUID
LEFT JOIN 
(
    SELECT DISTINCT ClockSerialNumber, ClockVoltage
    FROM tb_Session 
) SES
ON SES.ClockSerialNumber = CLK.SerialNumber
WHERE DHA.ReturnedDate IS NULL
ORDER BY SIT.[Name] ASC

那样应该确保SES ClockSerialNumber 的每个唯一组合仅包含一条记录和 ClockVoltage

关于SQL:需要删除包含多个连接的查询中的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3578006/

相关文章:

mysql - 4 列的平均值,具有随机空值

用于选择修复行数 "families"的 SQL

带子查询的 MySql 更新语句

php - SQL LEFT JOIN 问题 - 结果错误

sql - 多个小删除

mysql - 在 SQL 和 sqlalchemy 中联接和添加数据

python - 将原始 sql 映射到 django orm

MYSQL:从表A中选择,基于在表B中看到的用户日期

sql - JSON 扁平化和表创建

MYSQL 从列匹配的表中选择