【问题标题】:How to rewrite a query without using subquery如何在不使用子查询的情况下重写查询
【发布时间】:2022-01-03 04:22:16
【问题描述】:

首先,我正在尝试做的一些背景知识: 我有一个名为 Invoices 的表,如果我运行这两个 SELECT,我会得到以下信息:

SELECT AID, PPID, Amount, Type, Invoice FROM Invoices WHERE Type > 3 AND PPID = 2250
AID PPID Amount Type Invoice
443 2250 4500 5 0
SELECT AID, PPID, Amount, Type, Invoice FROM Invoices WHERE Type > 3 AND PPID = 1442
AID PPID Amount Type Invoice
77 1442 4500 5 0
225 1442 4500 5 0

所以当 PPID = 2250 时它只返回 1 行,而当 PPID = 1442 时它返回 2 行(这很好)

现在我在这里有一个查询,它只给我带来只返回一行 (PPID = 2250) 的记录,如果它返回多于一行 (PPID = 1442),它不会带来任何东西。

SELECT
(SELECT TOP 1 I2.AID FROM cgpaccounts.dbo.Invoices I2 WHERE I2.Invoice = I1.Invoice AND I2.Type > 3 AND I2.PPID = I1.PPID) AS PaymentID,
I1.AID AS ChargeID,
CAST(I1.Amount AS FLOAT)/100 AS Amount,
I1.Invoice
FROM Invoices I1
WHERE I1.type <> 2 AND I1.type < 4 AND I1.Amount > 0 AND I1.PPID = 1442--added for tests only 
AND (SELECT COUNT(I3.AID) FROM Invoices I3 WHERE I3.Invoice = I1.Invoice AND I3.Type > 3 AND I3.PPID = I1.PPID) = 1

所以我想重写该查询而不使用子查询(我在 AccessDB 中运行它并且需要大量时间,我重写了其他查询并通过删除它改进的子查询,但我坚持这个现在一个)。

我已经走到这一步了,但老实说,我不确定我的想法是否正确。

SELECT
I2.AID AS PaymentID,
I1.AID AS ChangeID,
I1.Amount / 100 AS Amount,
I1.Invoice
FROM Invoices I1
INNER JOIN Invoices I2
ON I2.PPID = I1.PPID AND I2.Invoice = I1.Invoice
WHERE I2.Type > 3 AND I1.type <> 2 AND I1.type < 4 AND I1.Amount > 0 AND I1.PPID = 1442--added for tests only

当我使用 PPID = 2250 运行它时,我得到以下结果:(这是我所期望的)

PaymentID ChargeID Amount Invoice
443 83 45 0

当我使用 PPID = 1442 运行它时,我得到以下结果:(不是我所期望的,我认为我的逻辑有问题,并且我得到重复的结果)

PaymentID ChargeID Amount Invoice
77 76 45 0
225 76 45 0
77 224 45 0
225 224 45 0

总之,我想要做的是在没有子查询的情况下重写该查询,并添加条件以仅返回仅返回 1 行的结果。

我知道这是一个很长的问题,但我试图提供尽可能多的信息。

我希望有人可以帮助我,或者引导我朝着正确的方向前进。

【问题讨论】:

  • 左对齐的 SQL 很难读(和写)。正确的格式使 SQL 更容易。
  • @jarlh 感谢您告诉我,如果您能告诉我正确的格式化方法,我会很高兴
  • 例如stackoverflow.com/questions/70100735/… 更容易阅读 SQL。
  • @jarlh 谢谢,我已经编辑过了,谢谢提醒

标签: sql ms-access subquery


【解决方案1】:

尝试下面添加 DISTINCT 的脚本:

SELECT DISTINCT
I2.AID AS PaymentID,
I1.AID AS ChangeID,
I1.Amount / 100 AS Amount,
I1.Invoice
FROM Invoices I1, Invoices I2
WHERE I2.PPID = I1.PPID 
  AND I2.Invoice = I1.Invoice
  AND I2.Type > 3
  AND I1.type <> 2
  AND I1.type < 4 
  AND I1.Amount > 0 
  AND I1.PPID = 1442

【讨论】:

  • 没用,但是谢谢,结果还是和之前一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2014-06-06
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多