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

SQL查询从一个表中获取数据,从另一个表中仅从一行获取数据,sql,join,row,max,Sql,Join,Row,Max,我不知道如何在标题中解释我的问题,所以我会在这里更好地解释 我有两张桌子 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]

我不知道如何在标题中解释我的问题,所以我会在这里更好地解释

我有两张桌子

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)中获取数据的查询,它应该只有两行

然而,我需要来自Plazos的数据,但我只需要来自Plazos的数据 我需要的是将来自plazos的数据显示在与Ventas相同的行上,但仅显示来自最新plazos的数据

您可能会注意到,例如,在Plazos中有一个名为NumeroPlazo的列,它在相同的IdVenta上增加。。。在本例中,我需要显示:

Ventas IdVenta 182,数据来自Plazos IdPlazo 95(由于来自Plazos,IdPlazo 95在列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行为Venta,其中IdVenta=182,一行为IdVenta=183) 我想要的只是两排

然后我尝试了这个有效的查询…但只针对一行

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。。。 我这里的问题是…我如何使用后一个查询来获得我想要的每次销售的数据

我希望你能帮助我。。。 如果你需要我更具体一些,请告诉我


提前感谢

您可以使用交叉应用,它允许您在“发件人”列表中针对前面表格的每一行运行子查询

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

很简单,在你的第二个问题中,替换Ventas.IdVenta上的182

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