SQL查询从一个表中获取数据,并从另一个表

SQL查询从一个表中获取数据,并从另一个表

问题描述:

我不知道该如何解释在标题我的问题得到只有一行数据,所以我会更好地在这里解释一下......SQL查询从一个表中获取数据,并从另一个表

我有两个表

CREATE TABLE [dbo].[Ventas] 
(
    [IdVenta] [int] IDENTITY(1,1) NOT NULL, 
    [FechaVenta] [date] NULL, 
    [HoraVenta] [varchar](10) NULL, 
    [Subtotal] [money] NULL, 
    [Iva] [money] NULL, 
    [Total] [money] NULL, 
    [Saldo] [money] NULL, 
    [Abono] [money] NULL, 
    [FormaDePago] [varchar](50) NULL, 
    [Plazos] [int] NULL, 
    [Estado] [varchar](50) NULL, 
) 

CREATE TABLE [dbo].[Plazos] 
(
    [IdPlazo] [int] IDENTITY(1,1) NOT NULL, 
    [IdVenta] [int] NULL, 
    [NumeroPlazo] [int] NULL, 
    [FechaVencimiento] [date] NULL, 
    [FechaCorte] [date] NULL, 
    [FechaPenalizacion] [date] NULL, 
    [FechaLiquidacion] [date] NULL, 
    [Total] [money] NULL, 
    [Cargo] [money] NULL, 
    [Abono] [money] NULL, 
    [Estado] [varchar](50) NULL, 
) 

现在添加一些数据

INSERT [dbo].[Ventas] ([IdVenta], [FechaVenta], [HoraVenta], [Subtotal], [Iva], [Total], [Saldo], [Abono], [FormaDePago], [Plazos], [Estado]) VALUES (182, CAST(0x54360B00 AS Date), N'11:20', 500.0000, 55.0000, 555.0000, 333.0000, 222.0000, N'A Credito', 5, N'Pendiente De Pago') 
INSERT [dbo].[Ventas] ([IdVenta], [FechaVenta], [HoraVenta], [Subtotal], [Iva], [Total], [Saldo], [Abono], [FormaDePago], [Plazos], [Estado]) VALUES (183, CAST(0x54360B00 AS Date), N'12:29', 575.0000, 63.2500, 638.2500, 638.2500, 0.0000, N'Una Sola Exhibicion', 1, N'Pendiente De Pago') 


INSERT [dbo].[Plazos] ([IdPlazo], [IdVenta], [NumeroPlazo], [FechaVencimiento], [FechaCorte], [FechaPenalizacion], [FechaLiquidacion], [Total], [Cargo], [Abono], [Estado]) VALUES (93, 182, 1, CAST(0x54360B00 AS Date), CAST(0x57360B00 AS Date), CAST(0x5C360B00 AS Date), CAST(0x54360B00 AS Date), 111.0000, 0.0000, 111.0000, N'Liquidado') 
INSERT [dbo].[Plazos] ([IdPlazo], [IdVenta], [NumeroPlazo], [FechaVencimiento], [FechaCorte], [FechaPenalizacion], [FechaLiquidacion], [Total], [Cargo], [Abono], [Estado]) VALUES (94, 182, 2, CAST(0x73360B00 AS Date), CAST(0x75360B00 AS Date), CAST(0x7A360B00 AS Date), CAST(0x54360B00 AS Date), 111.0000, 0.0000, 111.0000, N'Liquidado') 
INSERT [dbo].[Plazos] ([IdPlazo], [IdVenta], [NumeroPlazo], [FechaVencimiento], [FechaCorte], [FechaPenalizacion], [FechaLiquidacion], [Total], [Cargo], [Abono], [Estado]) VALUES (95, 182, 3, CAST(0x91360B00 AS Date), CAST(0x94360B00 AS Date), CAST(0x99360B00 AS Date), NULL, 111.0000, 111.0000, 0.0000, N'Pendiente') 
INSERT [dbo].[Plazos] ([IdPlazo], [IdVenta], [NumeroPlazo], [FechaVencimiento], [FechaCorte], [FechaPenalizacion], [FechaLiquidacion], [Total], [Cargo], [Abono], [Estado]) VALUES (96, 183, 1, CAST(0x54360B00 AS Date), CAST(0x57360B00 AS Date), CAST(0x5C360B00 AS Date), NULL, 639.0000, 639.0000, 0.0000, N'Pendiente') 

外键Ventas.IdVenta = Plazos.IdVenta

好吧,这里的交易... 我需要使用一个查询,从所有销售(Ventas),它只能它应该是2行的数据...

但是,我需要从Plazos数据,但我只需要Plazos的数据 我需要的是显示Plazos上与Ventas同一行的数据,但只显示最近Plazo的数据...

您可能会注意到,例如,在Plazos中有一个名为NumeroPlazo,在同一个IdVenta增加...我需要在这个例子中显示:

Ventas IdVenta 182与数据从Plazos IdPlazo 95(因为从Plazos,IdPlazo 95有th e列数最高的Numero Plazos ... 当然IdVenta 183,但因为它只有一个Plazo,它会显示该数据从该plazo ...

目前,我有这个查询...

SELECT Ventas.*, Plazos.*, 
FROM Ventas INNER JOIN Plazos ON Plazos.IdVenta = Ventas.IdVenta 
WHERE Ventas.Estado = 'Pendiente De Pago' 
ORDER BY Ventas.FechaVenta DESC, Ventas.HoraVenta DESC 

但它返回4行(3行的文塔,其中IdVenta = 182,和一个地方IdVenta = 183) 我要的是只有2行......

然后我尝试这个查询工作...但只有一行

SELECT Ventas.*, Plazos.*, 
FROM Ventas INNER JOIN Plazos ON Plazos.IdVenta = Ventas.IdVenta 
WHERE Ventas.Estado = 'Pendiente De Pago' 
AND Plazos.NumeroPlazo = (SELECT MAX(Plazos.NumeroPlazo) FROM Plazos WHERE Plazos.IdVenta = 182) 
ORDER BY Ventas.FechaVenta DESC, Ventas.HoraVenta DESC 

显然它只适用于一个销售,因为我指定Plazos.IdVenta = 182 ... 我的问题在这里是...我如何使用后者的查询来获得我想要的每个销售数据...

我希望你能帮我... 如果你需要我更具体,请让我知道。

在此先感谢

您可以使用CROSS应用,它允许你在运行的每每行前表的子查询列表。

SELECT Ventas.*, Plazos.* 
FROM Ventas 
cross apply (
    select TOP(1) * 
    from Plazos 
    WhERE Plazos.IdVenta = Ventas.IdVenta 
    ORDER BY [NumeroPlazo] DESC) Plazos 
WHERE Ventas.Estado = 'Pendiente De Pago' 
ORDER BY Ventas.FechaVenta DESC, Ventas.HoraVenta DESC 

通过ROW_NUMBER()做起来可能更快,但这里的子查询会要求你在内部的水平,这可能不是一个坏主意,反正别名的所有列。

SELECT * 
FROM 
(
    SELECT 
     v.[IdVenta], v.[FechaVenta], v.[HoraVenta], v.[Subtotal], v.[Iva], v.[Total], v.[Saldo], v.[Abono], v.[FormaDePago], v.[Plazos], v.[Estado], 
     p.[IdPlazo], p.[NumeroPlazo], p.[FechaVencimiento], p.[FechaCorte], p.[FechaPenalizacion], p.[FechaLiquidacion], p.[Total] plazostotal, p.[Cargo], p.[Abono] plazasabono, p.[Estado] plazosestado, 
     RowN = ROW_NUMBER() over (partition by v.[IdVenta] order by p.[NumeroPlazo] desc) 
    FROM Ventas v 
    JOIN Plazos p ON p.IdVenta = v.IdVenta 
    WHERE v.Estado = 'Pendiente De Pago' 
) X 
WHERE RowN = 1 
ORDER BY FechaVenta DESC, HoraVenta DESC 

这很简单。在你的第二个问题上取代182对Ventas.IdVenta

SELECT Ventas.*, Plazos.* 
FROM Ventas INNER JOIN Plazos ON Plazos.IdVenta = Ventas.IdVenta 
WHERE Ventas.Estado = 'Pendiente De Pago' 
    AND Plazos.NumeroPlazo = (SELECT MAX(Plazos.NumeroPlazo) FROM Plazos WHERE Plazos.IdVenta = Ventas.IdVenta) 
ORDER BY Ventas.FechaVenta DESC, Ventas.HoraVenta DESC