2

你好我有一个问题在这里...

我先给你看我的桌子...

[Vendedores](
    [IdVendedor] [int] IDENTITY(1,1) NOT NULL,
    [IdGrupo] [int] NULL,
    [IdInfoContacto] [int] NULL,
    [ApellidoPaterno] [varchar](30) NULL,
    [ApellidoMaterno] [varchar](30) NULL,
    [Nombre] [varchar](35) NULL,
    [Estado] [varchar](10) NULL,
 CONSTRAINT [PK_Vendedores] PRIMARY KEY CLUSTERED 

[Clientes](
    [IdCliente] [int] IDENTITY(1,1) NOT NULL,
    [IdGrupo] [int] NULL,
    [IdVendedor] [int] NULL,
    [IdDireccion] [int] NULL,
    [IdInfoContacto] [int] NULL,
    [FechaAlta] [date] NULL,
    [ApellidoPaterno] [varchar](30) NULL,
    [ApellidoMaterno] [varchar](30) NULL,
    [Nombre] [varchar](40) NULL,
    [Empresa] [text] NULL,
    [Estado] [varchar](20) NULL,
    [Estatus] [varchar](20) NULL,
 CONSTRAINT [PK_Clientes] PRIMARY KEY CLUSTERED 

[dbo].[Mensajes](
    [IdMensaje] [int] IDENTITY(1,1) NOT NULL,
    [IdCliente] [int] NULL,
    [IdVendedor] [int] NULL,
    [CorreoRemitente] [varchar](100) NULL,
    [CorreoCliente] [varchar](100) NULL,
    [CorreosAdicionales] [varchar](max) NULL,
    [Tema] [varchar](100) NULL,
    [Mensaje] [varchar](max) NULL,
    [Fecha] [date] NULL,
    [Hora] [time](5) NULL,
 CONSTRAINT [PK_Mensajes] PRIMARY KEY CLUSTERED 

[Archivos](
    [IdArchivo] [int] IDENTITY(1,1) NOT NULL,
    [IdMensaje] [int] NULL,
    [Nombre] [varchar](max) NULL,
    [Ubicacion] [varchar](50) NULL,
 CONSTRAINT [PK_Archivos] PRIMARY KEY CLUSTERED 

在我正在开发的系统中有两种发送消息的方法......:

第一个是,您选择一个客户端,当发送消息时,客户端的 ID (IdCliente) 从 Clientes 表中获取并插入到 Mensajes 表的新行中。这样,当您要查看所有发送的消息时,您可以清楚地看到发送到哪个客户端。

第二个将是免费的,您可以发送给任何您想要的人,您不必选择客户。因此,当您注册新消息时,IdCliente 列将为空。

现在有一些注意事项:供应商是发送消息的卖家或用户,Archivos 是指文件,如果您想附加文件,对于每个文件,将在 Archivos 中插入一个新行,每个都带有同样的IdMensaje。

目前,我有一个查询,允许我查看我的所有消息(与客户端),并显示该消息附加了多少文件。这里是:

SELECT (Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno + ' ' + Clientes.Nombre) AS Cliente, Mensajes.* FROM (SELECT Mensajes.IdMensaje, Mensajes.IdCliente, Mensajes.IdVendedor, Mensajes.CorreoRemitente, Mensajes.CorreoCliente, Mensajes.CorreosAdicionales, Mensajes.Tema, Mensajes.Mensaje, Mensajes.Fecha, Mensajes.Hora, COUNT(Archivos.IdArchivo) AS Archivos FROM Mensajes LEFT OUTER JOIN Archivos ON Mensajes.IdMensaje = Archivos.IdMensaje GROUP BY Mensajes.IdMensaje, Mensajes.IdCliente, Mensajes.IdVendedor, Mensajes.CorreoRemitente, Mensajes.CorreoCliente, Mensajes.CorreosAdicionales, Mensajes.Tema, Mensajes.Mensaje, Mensajes.Fecha, Mensajes.Hora) AS Mensajes JOIN Clientes ON Clientes.IdCliente = Mensajes.IdCliente ORDER BY Mensajes.Fecha DESC, Mensajes.Hora DESC

"(Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno + ' ' + Clientes.Nombre) AS Cliente" 显示客户端全名

但是,现在我想要一个查询,其中显示与上面相同的信息......加上以下......

  • IdCliente = null 的消息
  • 如果 IdCliente = null 那么我上面提到的 Cliente 列将是“”(空格)

如果我需要更具体,请让我知道我必须在哪一部分提供更多信息。

我希望你们能帮助我提前谢谢

4

1 回答 1

2

首先,将您的 JOIN 更改为 LEFT JOIN:

LEFT JOIN Clientes ON Clientes.IdCliente = Mensajes.IdCliente

这将允许没有关联 IdCliente 的消息保留。要获得所需的空白空间,请使用 COALESCE:

COALESCE(Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno + ' ' + Clientes.Nombre, '') AS Cliente
于 2012-09-27T20:06:18.527 回答