【发布时间】: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 谢谢,我已经编辑过了,谢谢提醒