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

そして、私は少なくとも3回特定の行を取得しています... 55のすべての一致に対して(Like%55%を使用しているため)、その行が表示されるためだと思います。ただし、これらの行を1回だけ表示する必要があります。その問題を解決するにはどうすればよいですか?前もって感謝します。

4

3 に答える 3

4

あなたの論理は正しくありません。句の一致数はwhere、重複とは関係ありません。

結合に使用される 1 つ以上のテーブルに重複があるため、重複が作成されます。完全な重複 (すべての列) を取得している場合は、次のことができます。

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 句を使用しているため、2 回必要がないため、次のチェックを削除しました

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

obth テーブルに ID があるため、次の JOIN も削除し、Facturas と Client の間の JOIN を修正しました。

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

IFはremoveDatosLegales.Nombreと同じフィールドです。Clientes.Nombre

両方が問題を解決するかどうかはわかりませんが、少なくともクエリは改善されます。

于 2013-02-27T21:30:53.170 に答える