2

我有一个表,其中有一个名称列表,列中的第一个和最后一个。因此,名为“manager”的列的值可能为“John Doe”。我想纠正一个简单地遍历该表中每一行并显示“经理”列的第一个字母和姓氏的查询。我所做的一切都提出了“子查询返回不止一行”。

从小处着手,我刚刚决定拉出第一个字母:

SELECT id, LEFT((SELECT manager FROM my_table), 1) FROM my_table;

或者我只是完全基于这个

4

3 回答 3

2

您正在使用子查询来获取父查询的字段。因此,子查询只能返回一行。这样想:结果集是一个二维结构。一系列的列和行。子查询返回的数据必须与它返回的事物的物理约束相匹配。

由于您正在获取一个字段,这意味着一个 SINGLE 值。如果允许返回多个值,您实际上是在尝试将 2D 结果集转换为 3d 集(行 + 列加上从其中一个字段中长出的摩天大楼)。

您的查询根本不需要是子查询:

SELECT id, LEFT(manager, 1) AS first_letter FROM yourtable

此外,并不是说如果您想要单独的名字和姓氏,最好将它们存储为单独的字段。从一组名字/姓氏字段中重建一个名字很容易,但是很难将一个单一的名字可靠地分离成单独的名字和姓氏,例如

simple:
     John Doe   (fn: john, ln: doe)
hard:
     Billy Jo Todd (is that "Billy" and "Jo Todd", "Billy" and "Todd" with middle name Jo?

dead simple:

    field firstname = John
    field lastname = Doe
于 2012-11-10T23:39:01.523 回答
1

如果您想使用子查询,则此查询可以按您的意愿工作,尽管我不确定这是在任何情况下进行的最佳方式。我们需要更多关于您需要的信息来断言这一点。

SELECT 
  m1.id, 
  m2.manager

FROM 
  my_table AS m1 INNER JOIN
  (SELECT id, LEFT(manager, 1) AS manager FROM my_table) as m2
  ON m1.id = m2.id

http://sqlfiddle.com/#!2/9c395/6

于 2012-11-10T23:42:29.257 回答
0

您必须向子查询添加条件以返回要比较的行

SELECT manager FROM my_table WHERE id = 1
于 2012-11-10T23:40:22.223 回答