如何使用内部联接的选择查询而不重复行?

时间:2013-02-27 21:20:28

标签: sql select inner-join

我有以下表格:

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的每场比赛它将显示该行。 但是我只需要显示那些行一次。 我该怎么做才能解决这个问题? 提前谢谢。

3 个答案:

答案 0 :(得分:4)

你的逻辑错误。 where子句中的匹配数与重复项无关。

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

select distinct . . .

distinct关键字会删除行重复项。

我鼓励您找到问题的根源。不同的是相对昂贵的操作。在这种情况下,它将被用作绷带来隐藏实际问题 - 这在基础表中是重复的。

答案 1 :(得分: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

答案 2 :(得分: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)

如果DatosLegales.NombreClientes.Nombre的字段相同,则删除它。

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