我有如下问题:
SELECT
lp - prev_close_price AS ch,
(lp - prev_close_price) / prev_close_price AS chp,
short_name,
exchange,
description,
lp,
IFNULL(ask, 0) AS ask,
IFNULL(bid, 0) AS bid,
IFNULL(ask - bid, 0) AS spread,
IFNULL(open_price, prev_close_price) AS open_price,
IFNULL(high_price, prev_close_price) AS high_price,
IFNULL(low_price, prev_close_price) AS low_price,
prev_close_price,
volume
FROM
metaTQEjY,
lpTQEjY,
askTQEjY,
bidTQEjY,
open_todayTQEjY,
highlowTQEjY,
prevcloseTQEjY;
它返回0行,而所有表肯定都有值。
然后我试了这个
SELECT
prevcloseTQEjY.prev_close_price
FROM
metaTQEjY,
lpTQEjY,
askTQEjY,
bidTQEjY,
open_todayTQEjY,
highlowTQEjY,
prevcloseTQEjY;
仍为0行。但是
SELECT
prevcloseTQEjY.prev_close_price
FROM
prevcloseTQEjY;
正确返回上一个收盘价。为什么会这样?
2条答案
按热度按时间5ktev3wc1#
当您在from子句中列出所有表时,它将生成这些表的笛卡尔积。此链接是关于两个表的笛卡尔积的附加信息
如果您选择的是您知道存在的特定数据,这是很好的。但是,如果其中一个表为空,笛卡尔积将返回一个空集。
这里有一个sql的小提琴:三个表,一个是空的
如您所见,共有三个表,我从一个表中选择了一个值,但由于from语句包含所有三个表(包括一个空表),因此没有可供选择的数据,因此它返回0行。
但是在本例中:两个表仅包含数据
我选择了相同的列,但是我的from语句只有包含数据的表,这些表按预期返回行。
修复查询的方法有很多种,其中一种方法可能是使用左连接,如下面的回答所述:当一个表为空时选择多个表
g0czyy6m2#
您正在执行这些表的笛卡尔积。如果其中一个是空的,就得到一个空集。