如何在 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 子查询作为选项列表