【问题标题】:Multiple Inner Sub-queries not returning as expected多个内部子查询未按预期返回
【发布时间】:2017-06-01 15:08:48
【问题描述】:

以下是我的 SQL 表:

CREATE TABLE [dbo].[My_Employee_Schedule] (
[Emp_Sch_Id]    INT      IDENTITY (1, 1) NOT NULL,
[Schedule_Date] DATETIME NULL,
[Start_Time]    DATETIME NULL,
[End_Time]      DATETIME NULL,
[Emp_ID]        INT      NULL,
[Job_ID]        INT      NULL,
PRIMARY KEY CLUSTERED ([Emp_Sch_Id] ASC),
FOREIGN KEY ([Emp_ID]) REFERENCES [dbo].[My_Employee] ([Employee_Id]) ON DELETE CASCADE,
FOREIGN KEY ([Job_ID]) REFERENCES [dbo].[My_Job_Type] ([Job_Type_Id]) ON DELETE CASCADE
);

CREATE TABLE [dbo].[My_Job_Type] (
[Job_Type_Id] INT           IDENTITY (1, 1) NOT NULL,
[Job_Title]   NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([Job_Type_Id] ASC)
);

我正在创建一个 ASP.NET C# Web 应用程序,并尝试对这些数据执行以下操作:

  • 在外部 ASP 中继器中显示 Schedule_Date
  • 然后使用 Employee_Schedule 表中的 FK 显示 Job_Title(来自 My_Job_Type 表)

不显示与以下日期相关的作业,而是显示所有作业。

这是我当前的 SQL(显示“Waiter”、“Driver”和“Busser”):

SELECT Job_Title 
FROM My_Job_Type 
WHERE Job_Type_Id IN (
    SELECT Job_Id 
    FROM My_Employee_Schedule 
    WHERE Schedule_Date IN (
        SELECT DISTINCT CAST(Schedule_Date AS DATE) As Schedule_Date 
        FROM My_Employee_Schedule 
        WHERE Start_Time BETWEEN @startReportDate AND @endReportDate))

以下是我当前的输出:

这是当前数据:

Emp_Sch_Id Schedule_Date Start_Time End_Time Emp_ID Job_ID

1 03/06/2017 00:00:00 03/06/2017 09:00:00 03/06/2017 10:00:00 5 2

2 03/06/2017 00:00:00 03/06/2017 11:30:00 03/06/2017 12:30:00 6 1

3 03/06/2017 00:00:00 03/06/2017 14:00:00 03/06/2017 15:00:00 5 3

4 03/06/2017 00:00:00 03/06/2017 12:00:00 03/06/2017 13:00:00 4 2

5 03/06/2017 00:00:00 03/06/2017 12:15:00 03/06/2017 15:15:00 4 2

Job_Type_Id Job_Title

1 位服务员

2 驱动程序

3 巴塞尔

【问题讨论】:

  • 在 My_Job_Type 表中,“Waiter”、“Driver”和“Busser”是唯一的行。我认为这个当前的 SQL 语句正在显示每个 div 中的所有行。但是,Job_Id [外键] 在 Employee_Schedule 表中的每一行中附加了一个特定的 Job。我不想在每个 div 中显示,我只想显示 FK 与 Employee_Schedule 行相关联的作业。
  • 例如,只有 Waiter 应该出现在星期六下,因为 Schedule_Date 为 3/6/2017 的 Employee_Schedule 行有一个 Job_ID 等于 1
  • 你能把这些表中的数据贴出来吗?没有它,我们很难知道结果是否正确。
  • @scsimon 嗨,我已经发布了上面的表格数据。
  • 根据您的变量设置,我发布的查询应该返回正确的结果,但您在此数据集中只有 3/6,并且显示的日期超出了此范围。

标签: c# asp.net sql-server


【解决方案1】:

据我所知,与嵌套的不相关子查询相比,您似乎只需要一个 inner join

select distinct
    t.Job_Title
from
    My_Job_Type t
    inner join
        My_Employee_Schedule s on 
        s.Job_ID = t.Job_Type_ID
where
    s.Schedule_Date between @startReportDate and @endReportDate

【讨论】:

  • 非常感谢您提供的解决方案。如果我现在想在 Job_Title 下方显示 Employee_Name,是否需要另一个联接?顺便说一句,Employee_Name 是 Employee 表中的一列,上面的 Emp_ID 是 FK。
  • 可能是因为我在您提供的任何表格中都没有看到员工姓名。我猜它会使用 Emp_ID 列加入 My_Employee_Schedule 表......
  • 如果我在上面发布我的附加表格,您能否更新您的答案以包含解决方案?因为它仍然属于多个子查询的类别?
  • @user2911539 Stack Overflow 建议打开一个新问题,并附上指向该问题的参考链接,否则该线程将永远不会结束,这将变成博客而不是问答论坛。
  • 没问题@user2911539,我看到这个问题已经深入到 C# 领域和数据库之外,很高兴他们能提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
相关资源
最近更新 更多