【问题标题】:What does it mean to SELECT a number?选择一个数字是什么意思?
【发布时间】:2016-01-02 16:08:42
【问题描述】:

我正在查看我的书中的一个示例,SQL 反模式。示例表是

         TreePaths
==============================
    ancestor | descendant
------------------------------
       1          1
       1          2 
       1          3
       1          4
       1          5
       1          6
       1          7
       2          2
       2          3
       3          3
       4          4
       4          5
       4          6
       4          7
       5          5
       6          6
       6          7
       7          7

询问我对此感到困惑

INSERT INTO TreePaths (ancestor, descendant)
   SELECT t.ancestor, 8
   FROM TreePaths AS t
   WHERE t.descendant = 5
 UNION ALL
   SELECT 8,8

所以让我先了解一下子查询

SELECT t.ancestor, 8
FROM TreePaths AS t
WHERE t.descendant = 5

这应该返回

t.ancestor  |   ???? 
---------------------
   5              ?
   5              ?
   5              ?

我以为

SELECT x, y

表示xy 是名称或列,而8 不是列的名称。这到底是怎么回事?

【问题讨论】:

    标签: mysql sql algorithm database-design tree


    【解决方案1】:

    在这种情况下,它们实际上只是代表数字,这些是文字。由于您标记了 MySql,您可以检查它here

    所以子查询会返回

    t.ancestor  |   8 
    ---------------------
       1              8
       4              8
       5              8
    

    在帐户中取UNION,它会返回

    t.ancestor  |   8 
    ---------------------
       1              8
       4              8
       5              8
       8              8
    

    【讨论】:

    • 然后SELECT 8,8 只是返回......究竟是什么?
    • 它将仅返回值 8,8.. 取决于 where 子句的行数。如果你运行SELECT 8,8 FROM TreePaths AS t WHERE t.descendant = 5,你会得到三行有两个值,8,8
    • 啊,我认为WHERE 子句仅适用于它出现的子查询。我认为这是两个单独的查询,(1)SELECT t.ancestor, 8 FROM TreePaths AS t WHERE t.descendant = 5 和(2)SELECT 8,8 ,然后将其结果行与UNION ALL 组合。不对吗?
    • 是的,没错 :) 我只是把这个条件作为一个例子来说明你会得到多少条记录
    【解决方案2】:

    xy表达式,它们为表中的每一行计算一次,其值被视为当前行中的对应列。 8 也是一个表达式,每行计算一次,其值被视为常量“8”。

    在这种情况下,查询将返回

    t.ancestor   |   8
    ------------------
      1              8
      4              8
      5              8
    

    正如 scaisEdge 观察到的那样。

    【讨论】:

      【解决方案3】:

      在这种情况下,查询应该返回

      t.ancestor   |   8
      ------------------
        1              8
        4              8
        5              8
      

      您选择 t.ancestor,其中后代 = 5

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        • 1970-01-01
        • 2014-06-15
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        相关资源
        最近更新 更多