请注意,我是一个完整的 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/