编写SQL查询以查找根本没有销售的产品?(哪一个是有效的,为什么)
根据问题标题,我想了解哪种SQL是高效的,以及为什么基于以下解决方案,假设表产品(数百万行)和销售(数十亿行)中的数据量都很高。下面是模式的详细信息。我对获得问题的解决方案不感兴趣,但我想更好地了解最佳解决方案编写SQL查询以查找根本没有销售的产品?(哪一个是有效的,为什么),sql,Sql,根据问题标题,我想了解哪种SQL是高效的,以及为什么基于以下解决方案,假设表产品(数百万行)和销售(数十亿行)中的数据量都很高。下面是模式的详细信息。我对获得问题的解决方案不感兴趣,但我想更好地了解最佳解决方案 CREATE TABLE PRODUCTS ( PRODUCT_ID INTEGER, PRODUCT_NAME VARCHAR2(30) ); CREATE TABLE SALES ( SALE_ID INTEGER,
CREATE TABLE PRODUCTS
(
PRODUCT_ID INTEGER,
PRODUCT_NAME VARCHAR2(30)
);
CREATE TABLE SALES
(
SALE_ID INTEGER,
PRODUCT_ID INTEGER,
YEAR INTEGER,
Quantity INTEGER,
PRICE INTEGER
);
INSERT INTO PRODUCTS VALUES ( 100, 'Nokia');
INSERT INTO PRODUCTS VALUES ( 200, 'IPhone');
INSERT INTO PRODUCTS VALUES ( 300, 'Samsung');
INSERT INTO PRODUCTS VALUES ( 400, 'LG');
INSERT INTO SALES VALUES ( 1, 100, 2010, 25, 5000);
INSERT INTO SALES VALUES ( 2, 100, 2011, 16, 5000);
INSERT INTO SALES VALUES ( 3, 100, 2012, 8, 5000);
INSERT INTO SALES VALUES ( 4, 200, 2010, 10, 9000);
INSERT INTO SALES VALUES ( 5, 200, 2011, 15, 9000);
INSERT INTO SALES VALUES ( 6, 200, 2012, 20, 9000);
INSERT INTO SALES VALUES ( 7, 300, 2010, 20, 7000);
INSERT INTO SALES VALUES ( 8, 300, 2011, 18, 7000);
INSERT INTO SALES VALUES ( 9, 300, 2012, 20, 7000);
COMMIT;
--解决方案1
SELECT P.PRODUCT_NAME
FROM PRODUCTS P
LEFT OUTER JOIN
SALES S
ON (P.PRODUCT_ID = S.PRODUCT_ID);
WHERE S.QUANTITY IS NULL
--解决方案2
SELECT P.PRODUCT_NAME
FROM PRODUCTS P
WHERE P.PRODUCT_ID NOT IN
(SELECT DISTINCT PRODUCT_ID FROM SALES);
--解决方案3
SELECT P.PRODUCT_NAME
FROM PRODUCTS P
WHERE NOT EXISTS
(SELECT 1 FROM SALES S WHERE S.PRODUCT_ID = P.PRODUCT_ID);
这篇评论太长了 正如使用提供的表定义编写的那样,这三个查询在语义上是不同的 从逻辑上讲,第一个查询与其他两个查询不同。除非
数量
声明为非空
,否则它可以返回数量为空
的匹配记录
第二个查询使用冗余的select distinct
。我猜所有像样的数据库都会优化它。通常的语法是:
SELECT P.PRODUCT_NAME
FROM PRODUCTS P
WHERE P.PRODUCT_ID NOT IN (SELECT PRODUCT_ID FROM SALES);
而且,这并不等于第三个。如果SALES.PRODUCT\u ID
始终为NULL
,则此查询将不返回任何行
从语义上讲,我更喜欢
不存在的第三个版本。但是,根据数据库的不同,前两个(固定?)版本中的一个可能会更快。与任何性能问题一样,答案取决于您的数据、数据结构、数据库引擎,甚至可能取决于您的硬件。我删除了不兼容的数据库标记。请随意为您真正使用的hte数据库添加标记。