【问题标题】:Error on SQL Server tables while performing a join执行联接时 SQL Server 表出错
【发布时间】:2016-01-16 18:07:31
【问题描述】:

我正在尝试在 4 个表之间执行联接调度表、员工表、机器表和板表。

问题是,在计划表中,它的主键是日期,而在表的其余部分,其主键是 char。我正在尝试将表中的主键转换为 char 以使其与其他主键相同,但我不知道如何。这是我到目前为止所做的事情

create table Machine
(
    MachineID char(5),
    MachineType varchar(10) NOT NULL,
    MachineStatus varchar(10)NOT NULL
)

create table Employee
(
    EmployeeID char(5) Primary Key,
    EmployeeName varchar(30) NOT NULL,
)

create table Plate
(
    PlateID char(5) Primary Key,
    PlateModel varchar(30) NOT NULL,
)

create table MachineSchedule
(
    DateSchedule date Primary Key,
)

这是我的加入

SELECT Employee.EmployeName, Plate.PlateModel, Machine.MachineID, Machine.MachineType, Machine.MachineStatus
FROM Employee, Plate, Machine
JOIN MachineSchedule
ON MachineSchedule.DateSchedule=Machine.MachineID;

这是它给出的错误从字符串转换日期和/或时间时转换失败。

【问题讨论】:

  • 您发布的表定义真的完整吗?您在 MachineSchedule 表中可能没有 MachineID 列吗?
  • MachineSchedule.DateSchedule 是 date 类型,但 Machine.MachineID 是 char(5) 类型。您无法检查日期和字符串是否相等。 ID的格式是什么?
  • 将 machineID 添加到 MachineSchedule 表中。
  • 您如何将日期值塞进 5 个字符中,然后将其命名为 MachineID?没有意义。如果您使用特殊的日期编码,则还必须将其合并到逻辑中。但更有可能的是,从名称来看,这些表似乎一开始都没有以有意义的方式相互关联。
  • 所以我应该像其他ID一样更改DateSchedule吗?我刚开始在课堂上学习 sql,这实际上是他们给我的基础知识。对于加入的东西,我在加入 ID 时会从其他表中调用,这就是为什么我没有将机器 ID 纳入机器计划。

标签: mysql sql-server sql-server-2016


【解决方案1】:

您的表结构不正确,您应该使用整数数据类型作为主键而不是 char 或 datetime,因为它会创建索引,并且我们不能在 char 和 date 数据类型上连接表,它们永远不会具有相同的值;最后,from 子句中其他表的连接在哪里。 Employee,Plate,Machine应该有join条件。

也缺少主键和外键约束

【讨论】:

    【解决方案2】:

    表格设计及其关系未正确完成。基于这种设计和关系最简单的解决方案,我的意思是查询无错误:

    DROP TABLE [MachineSchedule];
    

    创建表

    CREATE TABLE [dbo].[MachineSchedule](
        [DateSchedule] [date] NOT NULL,
        [MachineID] [char](5) NULL,
    PRIMARY KEY CLUSTERED 
    (
        [DateSchedule] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    SET ANSI_PADDING OFF
    GO
    

    更改的查询

    SELECT Employee.EmployeeName, Plate.PlateModel, Machine.MachineID, Machine.MachineType, Machine.MachineStatus
    FROM Employee, Plate, Machine
    JOIN MachineSchedule
    ON MachineSchedule.MachineID = Machine.MachineID;
    

    【讨论】:

      【解决方案3】:

      你认为 日期列=字符列?

      与 conver 一起使用 to char 例如

      开启 cast(m.id as char(20))=ma.id 或者更新列类型

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多