如何在 SQL 子查询中使用 WHERE EXISTS?

Posted

技术标签:

【中文标题】如何在 SQL 子查询中使用 WHERE EXISTS?【英文标题】:How to use WHERE EXISTS in a SQL subquery? 【发布时间】:2020-05-16 05:15:31 【问题描述】:

我需要找到在 VICTORIA AVE 的一家酒吧点酒的不同饮酒者。 2020 年 3 月。

这是我试图从中检索数据的表:

CREATE TABLE ORDERS(    /* Drinkers visit pubs and consumes drinks */
DRINKER     VARCHAR(30) NOT NULL,   /* Drinker name */
PUB         VARCHAR(30) NOT NULL,   /* Pub name */
ODATE       DATE        NOT NULL,   /* Order date   */
DRINK       VARCHAR(30) NOT NULL,   /* Drink name   */
DRINK_NO    DECIMAL(2)  NOT NULL,   /* A sequence number of a drink */
    CONSTRAINT ORDERS_PKEY PRIMARY KEY(DRINKER, PUB, ODATE, DRINK, DRINK_NO),
    CONSTRAINT ORDERS_FKEY1 FOREIGN KEY(PUB, DRINK) REFERENCES SERVES(PUB, DRINK),
    CONSTRAINT ORDERS_FKEY2 FOREIGN KEY(DRINKER) REFERENCES DRINKERS(DRINKER)   );

CREATE TABLE LOCATED(   /* Pubs have locations */
PUB         VARCHAR(30) NOT NULL,   /* Pub name */
STREET      VARCHAR(30) NOT NULL,   /* Street name  */
BLDG_NO     DECIMAL(4)  NOT NULL,   /* Building number  */
    CONSTRAINT LOCATED_PKEY PRIMARY KEY(PUB) );

到目前为止,这是我的 SELECT 语句:

SELECT DISTINCT DRINKER 
FROM ORDERS 
WHERE EXISTS (SELECT PUB 
              FROM LOCATED
              WHERE STREET = 'VICTORIA AVE.' 
              AND ORDERS.ODATE >= STR_TO_DATE('01-MAR-2020','%d-%M-%Y')
              AND ORDERS.ODATE <= STR_TO_DATE('01-MAR-2020','%d-%M-%Y'));

【问题讨论】:

@mechanical_meat 是的,抱歉,这只是一个错字 【参考方案1】:

子查询需要在其WHERE 子句中与主查询相关。

SELECT DISTINCT DRINKER 
FROM ORDERS 
WHERE EXISTS (SELECT PUB 
              FROM LOCATED
              WHERE LOCATED.PUB = ORDERS.PUB
              AND STREET = 'VICTORIA AVE.' 
              AND ORDERS.ODATE >= STR_TO_DATE('01-MAR-2020','%d-%M-%Y')
              AND ORDERS.ODATE <= STR_TO_DATE('31-MAR-2020','%d-%M-%Y'));

【讨论】:

我只能使用 EXISTS 或 NOT EXISTS

以上是关于如何在 SQL 子查询中使用 WHERE EXISTS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在标准 SQL 的 WHERE 子句中使用 WITH 子查询作为选项列表

如何在 Hive/SQL 的 where/have 子句中使用 min()(以避免子查询)

SQL 中 where 后面可不可以跟上子查询

如何使用 WHERE IN 子查询优化 SQL 查询

SQL在where子句中使用子选择中的列

如何在WHERE子句中使用MS Access SQL子查询来替换长OR表达式