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 

私が開発しているシステムでメッセージを送信するには、2 つの方法があります...:

1 つ目は、クライアントを選択することです。メッセージが送信されると、クライアントの ID (IdCliente) が Clientes テーブルから取得され、Mensajes テーブルの新しい行に挿入されます。そうすれば、送信されたすべてのメッセージを確認したい場合に、どのクライアントに送信されたかが明確にわかります。

2 つ目は無料で、誰にでも送信できます。クライアントを選択する必要はありません。したがって、新しいメッセージを登録すると、IdCliente 列は null になります。

いくつかの注意点があります。Vendor はメッセージを送信した販売者またはユーザーです。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 に答える