选择mysql返回0行

时间:2018-07-23 08:37:20

标签: mysql sql select

我有如下查询:

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。为什么会这样?

2 个答案:

答案 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