相关的子查询

时间:2013-02-20 17:41:18

标签: sql plsql subquery

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

2 个答案:

答案 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;

An SQLfiddle to test with

答案 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