Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 - Fatal编程技术网

编写SQL查询以查找根本没有销售的产品?(哪一个是有效的,为什么)

编写SQL查询以查找根本没有销售的产品?(哪一个是有效的,为什么),sql,Sql,根据问题标题,我想了解哪种SQL是高效的,以及为什么基于以下解决方案,假设表产品(数百万行)和销售(数十亿行)中的数据量都很高。下面是模式的详细信息。我对获得问题的解决方案不感兴趣,但我想更好地了解最佳解决方案 CREATE TABLE PRODUCTS ( PRODUCT_ID INTEGER, PRODUCT_NAME VARCHAR2(30) ); CREATE TABLE SALES ( SALE_ID INTEGER,

根据问题标题,我想了解哪种SQL是高效的,以及为什么基于以下解决方案,假设表产品(数百万行)和销售(数十亿行)中的数据量都很高。下面是模式的详细信息。我对获得问题的解决方案不感兴趣,但我想更好地了解最佳解决方案

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数据库添加标记。