返回3个表中的所有值

时间:2016-07-20 18:03:16

标签: sql sql-server tsql

我有三张桌子:

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表中不存在。

1 个答案:

答案 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)

输出:

enter image description here

  

一些反馈使这个过程更容易。共享您的架构(关系)和/或一些示例数据。另外,请考虑为列创建更多逻辑/直观的名称,以便隐含关系和内容。

原始答案

这听起来像你在找什么。以下查询将返回所有端口信息(来自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.