我有以下表格:
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的每场比赛它将显示该行。 但是我只需要显示那些行一次。 我该怎么做才能解决这个问题? 提前谢谢。
答案 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.Nombre
与Clientes.Nombre
的字段相同,则删除它。
不确定这两件事是否能解决您的问题,但至少可以改善您的查询。