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条记录),因此它们通常可以作为左连接重写。