我有三张桌子:
CREATE TABLE [dbo].[Data]
(
[PorID] [int] NOT NULL,
[HourS] [int] NOT NULL
)
CREATE TABLE [dbo].[TimeData]
(
[HId] [bigint] NOT NULL,
[HName] [varchar](50) NOT NULL,
[HHour] [int] NOT NULL
)
CREATE TABLE [dbo].PortInfo
(
[Id] [bigint] NOT NULL,
[PortName] [varchar](50) NOT NULL
)
即使Data
表中没有该端口,它也应返回PortInfo
表中所有端口的行。同样,它应该总是为每个端口返回24条记录。结果应显示每条记录的所有端口,即使Data
表中不存在。
答案 0 :(得分:0)
更新了答案
根据你在评论中告诉我的内容以及填写一些空白,这就是我认为你正在寻找的东西。这将为每个端口生成每小时的记录。
SELECT
td.HHour,
td.HName,
pi.Id,
pi.PortName,
d.PorID,
d.HourS
FROM
dbo.TimeData td
FULL OUTER JOIN
dbo.PortInfo pi
ON (1 = 1)
LEFT OUTER JOIN
dbo.Data d
ON (d.PorID = pi.Id)
AND (d.HourS = td.HHour)
输出:
一些反馈使这个过程更容易。共享您的架构(关系)和/或一些示例数据。另外,请考虑为列创建更多逻辑/直观的名称,以便隐含关系和内容。
原始答案
这听起来像你在找什么。以下查询将返回所有端口信息(来自PortInfo
),即使其Id
不在Data
表(PorId
)中也是如此。这是通过在LEFT JOIN
表格上使用PortInfo
来完成的。
SELECT
po.Id,
po.PortName,
d.HourS
FROM
dbo.PortInfo po
LEFT JOIN
dbo.Data d
ON (d.PorID = po.Id)
现在,您没有提及应该如何使用第3张表TimeData
,但如果您想在结果中使用该信息,则只需LEFT JOIN
即可好:
SELECT
po.Id,
po.PortName,
d.HourS,
td.HName,
td.HHour
FROM
dbo.PortInfo po
LEFT JOIN
dbo.Data d
ON (d.PorID = po.Id)
LEFT JOIN
dbo.TimeData td
ON (td.HId = d.HourS) -- I assume this is the link, you may need to update if not.