我使用C#和MySQL服务器,我有两个这样的表:
表1
+--------+----------------------+-----------+----------------+
| aut_id | aut_name | country | home_city |
+--------+----------------------+-----------+----------------+
| AUT001 | William Norton | UK | Cambridge |
| AUT002 | William Maugham | Canada | Toronto |
| AUT003 | William Anthony | UK | Leeds |
| AUT004 | S.B.Swaminathan | India | Bangalore |
| AUT005 | Thomas Morgan | Germany | Arnsberg |
| AUT006 | Thomas Merton | USA | New York |
| AUT007 | Piers Gibson | UK | London |
| AUT008 | Nikolai Dewey | USA | Atlanta |
| AUT009 | Marquis de Ellis | Brazil | Rio De Janerio |
| AUT010 | Joseph Milton | USA | Houston |
| AUT011 | John Betjeman Hunter | Australia | Sydney |
| AUT012 | Evan Hayek | Canada | Vancouver |
| AUT013 | E. Howard | Australia | Adelaide |
| AUT014 | C. J. Wilde | UK | London |
| AUT015 | Butler Andre | USA | Florida |
+--------+----------------------+-----------+----------------+
表2
+--------+-----+
| ID | PreFix |
+--------+-----+
| 1 | Wi |
| 2 | Th |
| 3 | E |
+--------+-----+
我想从table_2中选择一个名字以任意前缀开头的作者,结果如下:
+--------+----------------------+-----------+----------------+
| aut_id | aut_name | country | home_city |
+--------+----------------------+-----------+----------------+
| AUT001 | William Norton | UK | Cambridge |
| AUT002 | William Maugham | Canada | Toronto |
| AUT003 | William Anthony | UK | Leeds |
| AUT005 | Thomas Morgan | Germany | Arnsberg |
| AUT006 | Thomas Merton | USA | New York |
| AUT012 | Evan Hayek | Canada | Vancouver |
| AUT013 | E. Howard | Australia | Adelaide |
+--------+----------------------+-----------+----------------+
我尝试了这个解决方案:
SELECT * FROM table_1 where aut_name like concat((SELECT PreFix FROM table_2),' %');
但我得到这个错误消息:
错误代码:1242子查询返回1个以上的行
2条答案
按热度按时间b0zn9rqh1#
尝试使用JOIN而不是子查询:
SQL
CONCAT
函数旨在将多个字符串连接为单个字符串,将单个字符串值作为参数并将它们组合在一起。CONCAT期望单个标量值作为参数,而不是子查询可能返回的多行结果集。要解决类似于您在这里提出的问题,您需要利用
JOIN
的强大功能,该语句允许您根据不同表之间的相关列(通常称为外键)合并不同表中的行。这样,您可以确保table_1
中的每一行都与table_2
中具有匹配PreFix
值的所有行进行比较,这是一个可以在ON
子句之后指定的条件。附带说明一下,如果您提供SQL的DDL和DML语句来构建测试用例和进行测试所需的最小可重现示例,我们将非常感激。我冒昧地创建了这些声明,所以我将在这里发布它们,以帮助任何人稍后来了解,玩,测试和改进我们的工作:
gopyfrb32#
您收到的错误消息
"Subquery returns more than 1 row"
指示子查询(SELECT PreFix FROM table_2)
返回多行,因此不能用作CONCAT()
函数中的参数。要解决这个问题,可以使用
IN
运算符而不是LIKE
来比较table_2
的前缀和table_1.
的aut_name
的开头。或者,您可以使用
JOIN
语句来实现相同的结果。下面是使用JOIN
的代码:这段代码选择
table_1
中的所有行,其中aut_name
以table_2
中的任何前缀开头。