Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 相关子查询_Sql_Plsql_Subquery - Fatal编程技术网

Sql 相关子查询

Sql 相关子查询,sql,plsql,subquery,Sql,Plsql,Subquery,啊。。让我沮丧。教科书要求我们重写以下语句,而不使用相关子查询 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

啊。。让我沮丧。教科书要求我们重写以下语句,而不使用相关子查询

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

试试这个:

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

您可以将其编写为一个简单的
左连接
,而不需要任何子查询

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;
选择不同的供应商名称、发票编号、发票日期、发票总额
来自供应商V
加入我
在V.VENDOR\u ID=I.VENDOR\u ID上
左连接发票I2
在V.VENDOR\u ID=I2.VENDOR\u ID上
和(I2.发票号

.

有点奇怪的查询,如果
发票日期
发票编号
不是同一发票的最小值,它根本不会显示任何结果。我想知道为什么教科书对这个查询有不同的定义。这有点代码味道,他们没有在相关的表上设置正确的唯一性约束,或者没有费心检查。:O我从没想过这是可能的。。这个解决方案有效!我现在必须研究这个解决方案。找出LeftJoin替换子查询的原因。+1相关子查询有效地完成了与左连接相同的工作(只要相关导致第一个表中的每条记录不超过1条记录),因此它们通常可以作为左连接重写。