我有如下查询:
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;
正确返回prev_close_price。为什么会这样?
答案 0 :(得分:7)
您正在执行这些表的笛卡尔积。如果其中一个为空,则会得到一个空集。
答案 1 :(得分:1)
在FROM子句中列出所有表时,它将产生这些表的笛卡尔积。 This link is additional info on the Cartesian product of two tables
如果您选择已知的特定数据,这很好。但是,如果其中一个表为空,则笛卡尔乘积将返回一个空集。
这是SQL的提琴:Three tables, one is empty
您可以看到,有三个表,我从一个表中选择了一个值,但是由于我的FROM语句具有所有三个表(包括一个空表),因此没有可供选择的数据,因此它返回0行。
但是在此示例中:Two tables with data only
我选择了同一列,但是我的FROM语句仅包含带有数据的表,该表将按预期返回行。
有多种方法可以解决您的查询,其中一种方法可以使用此答案中所述的左联接:Select multiple tables when one table is empty