Gahh ..让我感到沮丧。教科书要求我们在不使用共同相关子查询的情况下重写以下语句。
SELECT DISTINCT V.VENDOR_NAME, I.INVOICE_NUMBER, I.INVOICE_DATE, I.INVOICE_TOTAL
FROM VENDORS V
JOIN INVOICES I
ON V.VENDOR_ID = I.VENDOR_ID
WHERE I.INVOICE_DATE IN
(SELECT MIN(INVOICE_DATE) FROM INVOICES IV WHERE IV.VENDOR_ID = V.VENDOR_ID)
AND I.INVOICE_NUMBER IN
(SELECT MIN(INVOICE_NUMBER) FROM INVOICES IV WHERE IV.VENDOR_ID = V.VENDOR_ID)
ORDER BY V.VENDOR_NAME
我该怎么做?无论如何,我无法想到在没有子查询的情况下重写它:S
答案 0 :(得分:2)
你可以把它写成一个简单的LEFT JOIN
,根本没有子查询;
SELECT DISTINCT V.VENDOR_NAME, I.INVOICE_NUMBER, I.INVOICE_DATE, I.INVOICE_TOTAL
FROM VENDORS V
JOIN INVOICES I
ON V.VENDOR_ID = I.VENDOR_ID
LEFT JOIN INVOICES I2
ON V.VENDOR_ID = I2.VENDOR_ID
AND (I2.INVOICE_NUMBER < I.INVOICE_NUMBER OR
I2.INVOICE_DATE < I.INVOICE_DATE)
WHERE I2.INVOICE_NUMBER IS NULL;
答案 1 :(得分:1)
试试这个:
SELECT
DISTINCT V.VENDOR_NAME,
I.INVOICE_NUMBER,
I.INVOICE_DATE,
I.INVOICE_TOTAL
FROM VENDORS V
JOIN INVOICES I
ON V.VENDOR_ID = I.VENDOR_ID
JOIN
(
SELECT
VENDOR_ID,
MIN(INVOICE_DATE) MIN_INVOICE_DATE,
MIN(INVOICE_NUMBER) MIN_INVOICE_NUMBER
FROM INVOICES
GROUP BY VENDOR_ID
) MV
ON V.VENDOR_ID = MV.VENDOR_ID
AND I.INVOICE_DATE= MV.MIN_INVOICE_DATE
AND I.INVOICE_NUMBER = MV.MIN_INVOICE_NUMBER
ORDER BY V.VENDOR_NAME