0

我有以下表格:

CREATE TABLE [dbo].[Clientes](
    [IdCliente] [int] IDENTITY(1,1) NOT NULL,
    [ApellidoPaterno] [varchar](max) NULL,
    [ApellidoMaterno] [varchar](max) NULL,
    [Nombre] [varchar](max) NULL,
    [Empresa] [text] NULL,
    [Estado] [varchar](20) NULL,
 CONSTRAINT [PK_Clientes] PRIMARY KEY CLUSTERED 
)


CREATE TABLE [dbo].[DatosLegales](
    [IdDatoLegal] [int] IDENTITY(1,1) NOT NULL,
    [IdCliente] [int] NULL,
    [Nombre] [varchar](max) NULL,
    [RFC] [varchar](20) NULL,
 CONSTRAINT [PK_DatosLegales] PRIMARY KEY CLUSTERED 
)

CREATE TABLE [dbo].[Facturas](
    [IdFactura] [int] IDENTITY(1,1) NOT NULL,
    [IdCliente] [int] NULL,
    [IdDatoLegal] [int] NULL,
    [Serie] [varchar](20) NULL,
    [Folio] [varchar](20) NULL,
    [UUID] [varchar](50) NULL,
    [FechaEmision] [date] NULL,
    [HoraEmision] [varchar](10) NULL,
    [RutaXML] [varchar](max) NULL,
    [RutaCBB] [varchar](max) NULL,
    [RutaPDF] [varchar](max) NULL,
    [Estado] [varchar](50) NULL,
 CONSTRAINT [PK_Facturas] PRIMARY KEY CLUSTERED 
)

Clientes.IdCliente 上的外键 = DatosLegales.IdCliente DatosLegales.IdDatoLegal = Facturas.IdDatoLegal

我正在使用以下查询

SELECT Facturas.IdFactura, Facturas.IdGrupo, (Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno + ' ' + Clientes.Nombre) AS Cliente, DatosLegales.Nombre, Facturas.Serie, Facturas.Folio, Facturas.UUID, Facturas.Estado, Facturas.FechaEmision, Facturas.HoraEmision 
FROM Facturas 
INNER JOIN Ventas ON (Facturas.IdFactura = Ventas.IdFactura) 
INNER JOIN Clientes ON (Clientes.IdCliente = Ventas.IdCliente) 
INNER JOIN DatosLegales ON (DatosLegales.IdDatoLegal = Facturas.IdDatoLegal) 
WHERE Facturas.IdGrupo = 1 AND (Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno + ' ' + Clientes.Nombre LIKE '%55%' OR  Clientes.Nombre + ' ' + Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno LIKE '%55%' OR DatosLegales.Nombre LIKE '%55%' OR Facturas.Serie LIKE '%55%' OR Facturas.Folio LIKE '%55%' OR Facturas.UUID LIKE '%55%' OR Facturas.IdFactura LIKE '%55%') 
ORDER BY IdFactura DESC

而且我得到一个特定的行至少三遍......我认为这是因为(因为我使用 Like%55%)对于 55 上的每场比赛它都会显示该行。但是我只需要显示这些行一次。我能做些什么来解决这个问题?提前致谢。

4

3 回答 3

4

你的逻辑不正确。子句中的匹配数where与重复项无关。

创建重复项是因为一个或多个用于连接的表中存在重复项。如果您得到完全重复(所有列),您可以执行以下操作:

select distinct . . .

关键字删除行distinct重复。

我鼓励你找到问题的根源。Distinct 是一个相对昂贵的操作。在这种情况下,它将被用作隐藏实际问题的绷带——这是基础表中的重复项。

于 2013-02-27T21:28:39.883 回答
1
SELECT DISTINCT Facturas.IdFactura,
     Facturas.IdGrupo,
     (Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno + ' ' + Clientes.Nombre)
         AS Cliente,
     DatosLegales.Nombre,
     Facturas.Serie,
     Facturas.Folio,
     Facturas.UUID,
     Facturas.Estado,
     Facturas.FechaEmision,
     Facturas.HoraEmision
FROM Facturas
     INNER JOIN Ventas
         ON (Facturas.IdFactura = Ventas.IdFactura)
     INNER JOIN Clientes
         ON (Clientes.IdCliente = Ventas.IdCliente)
     INNER JOIN DatosLegales
         ON (DatosLegales.IdDatoLegal = Facturas.IdDatoLegal) WHERE Facturas.IdGrupo = 1
     AND (Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno + ' ' + Clientes.Nombre LIKE
              '%55%'
          OR Clientes.Nombre + ' ' + Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno LIKE
                 '%55%'
          OR DatosLegales.Nombre LIKE '%55%'
          OR Facturas.Serie LIKE '%55%'
          OR Facturas.Folio LIKE '%55%'
          OR Facturas.UUID LIKE '%55%'
          OR Facturas.IdFactura LIKE '%55%') ORDER BY IdFactura DESC
于 2013-02-27T21:28:28.470 回答
0
SELECT Facturas.IdFactura,
         Facturas.IdGrupo,
         (Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno + ' ' + Clientes.Nombre)
             AS Cliente,
         DatosLegales.Nombre,
         Facturas.Serie,
         Facturas.Folio,
         Facturas.UUID,
         Facturas.Estado,
         Facturas.FechaEmision,
         Facturas.HoraEmision
    FROM Facturas
         INNER JOIN Clientes
             ON (Clientes.IdCliente = Facturas.IdCliente)
         INNER JOIN DatosLegales
             ON (DatosLegales.IdDatoLegal = Facturas.IdDatoLegal)
   WHERE Facturas.IdGrupo = 1
         AND (Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno + ' ' + Clientes.Nombre LIKE
                  '%55%'
              OR DatosLegales.Nombre LIKE '%55%'
              OR Facturas.Serie LIKE '%55%'
              OR Facturas.Folio LIKE '%55%'
              OR Facturas.UUID LIKE '%55%'
              OR Facturas.IdFactura LIKE '%55%')
ORDER BY IdFactura DESC;

删除了以下检查,因为由于您使用的是 LIKE 子句,因此您不需要两次

OR Clientes.Nombre + ' ' + Clientes.ApellidoPaterno + ' ' + Clientes.ApellidoMaterno LIKE
                     '%55%'

我还删除了以下 JOIN 并修复了 Facturas 和 Client 之间的 JOIN,因为您在 obth 表中有 Id。:

INNER JOIN Ventas
             ON (Facturas.IdFactura = Ventas.IdFactura)

IF与删除它也是DatosLegales.Nombre相同的字段。Clientes.Nombre

不确定这两件事是否会解决您的问题,但至少可以改善您的查询。

于 2013-02-27T21:30:53.170 回答