如何合并具有不同列计数的MySQL查询?
定义: 在结果中,*表示空列 表中的数据使得表中的每个字段都具有值Fieldname+RowCount,因此第1行中的列“a”包含值“a1”。 2个MySQL表 表1 字段名:a、b、c、d 表2 字段名:e、f、g、h、i、j 任务: 我想从每个表中获取前4行 独立查询如何合并具有不同列计数的MySQL查询?,sql,mysql,Sql,Mysql,定义: 在结果中,*表示空列 表中的数据使得表中的每个字段都具有值Fieldname+RowCount,因此第1行中的列“a”包含值“a1”。 2个MySQL表 表1 字段名:a、b、c、d 表2 字段名:e、f、g、h、i、j 任务: 我想从每个表中获取前4行 独立查询 SELECT Table1.* FROM Table1 WHERE 1 LIMIT 0,4 -- Colcount 4 SELECT Table2.* FROM Table2 WHERE 1 LIMIT 0,4 -- Colc
SELECT Table1.* FROM Table1 WHERE 1 LIMIT 0,4 -- Colcount 4
SELECT Table2.* FROM Table2 WHERE 1 LIMIT 0,4 -- Colcount 6
查询的简单合并失败,因为这两部分的列计数不同
Version1:向第一个查询添加两个空字段
因此,我将在结果集中获得以下字段:
a,b,c,d,i,j
a1,b1,c1,d1,*,*,
a2,b2,c2,d2,*,*,
....
....
e1,f1,g1,h1,i1,j1
e2,f2,g2,h2,i2,j2
a,b,c,d,i,j
a1,b1,c1,d1,*,*,*,*,*,*,
a2,b2,c2,d2,*,*,*,*,*,*,
....
....
*,*,*,*,e1,f1,g1,h1,i1,j1
*,*,*,*,e2,f2,g2,h2,i2,j2
....
....
问题是表2的字段名被表1覆盖
Version2-使用空字段移动列:
因此,我将在结果集中获得以下字段:
a,b,c,d,i,j
a1,b1,c1,d1,*,*,
a2,b2,c2,d2,*,*,
....
....
e1,f1,g1,h1,i1,j1
e2,f2,g2,h2,i2,j2
a,b,c,d,i,j
a1,b1,c1,d1,*,*,*,*,*,*,
a2,b2,c2,d2,*,*,*,*,*,*,
....
....
*,*,*,*,e1,f1,g1,h1,i1,j1
*,*,*,*,e2,f2,g2,h2,i2,j2
....
....
问题解决了,但我得到了许多空字段
是否存在已知的性能问题
你如何解决这个问题
是否有解决此问题的最佳实践 看起来最合理的是版本2,除了使用空字符串而不是空字符串。查询的输出应该是一个表,它是一组行,每一行都有相同的列名和类型。有些DBMS支持参差不齐的行—具有不同的列集,但这不是主流功能 您必须决定如何处理两组四行,两组中有不同的列 通常,最简单的选择是执行两个独立的查询。这两个结果集不具有可比性,不应混为一谈 如果选择版本1,则应该决定哪一组列名是合适的,或者使用“AS x”列别名创建一组复合名称 如果您选择版本2,那么您可能应该命名UNION的第一个子句的尾随列;目前,他们都没有名字:
SELECT Table1.*, '' AS e, '' AS f, '' AS g, '' AS h, '' AS i, '' AS j
FROM Table1 WHERE 1 LIMIT 0,4
UNION
SELECT '' AS a, '' AS b, '' AS c, '' AS d, Table2.*
FROM Table2 WHERE 1 LIMIT 0,4
第二个中的AS注释是多余的,但自洽的;联合体的两部分明确地具有相同的列标题
除了您提供了空字符串而不是NULL之外,您选择的符号对应于“外部联合”。您可以在RM/V2书籍中的文献E F Codd的选定部分中偶尔找到对它的引用;《外部万物批判》中的C J日期。SQL 1999将其作为联合联接提供;SQL 2003删除了非常不寻常的UNION JOIN,这是一个非常糟糕的特性
我将使用两个独立的查询。这需要一些思考,然后是一些特定于MySQL的解决方法。其概念是:联接将生成所需的表结构。您真正想要的是一个没有行“匹配”的完全外部连接。要做到这一点,我们需要一种可靠的方法来确保行不匹配,然后,我们必须联合、左连接和右连接,以克服MySQL没有完全外部连接的限制 MySQL 5.6架构设置: 问题1: :
这种语法:SELECT*FROM SELECT 1 as unique_field as Ax交叉连接A as A更容易理解为SELECT 1 as unique_field,*FROM A as A,但是MySQL不允许A*遵循字段规范。嘿,乔纳森,谢谢你的回答。我在CMS中使用它,插件可以注册查询。插件使用具有不同数据列/名称的不同表以获得更好的性能,我想比较查询。我正在寻找一种将空字段添加到查询中的最佳实践。
CREATE TABLE A (a int, b int, c int, d int);
CREATE TABLE B (e int, f int, g int, h int, i int, j int);
INSERT INTO A VALUES (1,1,1,1),(2,2,2,2);
INSERT INTO B VALUES (8,8,8,8,8,8),(9,9,9,9,9,9);
SELECT * FROM
(SELECT * FROM (SELECT "TableA" as unique_field) as Ax CROSS JOIN A) as A
LEFT JOIN
(SELECT * FROM (SELECT "TableB" as unique_field) as Bx CROSS JOIN B) AS B
on A.unique_field=B.unique_field
UNION
SELECT * FROM
(SELECT * FROM (SELECT "TableA" as unique_field) as Ax CROSS JOIN A) as A
RIGHT JOIN
(SELECT * FROM (SELECT "TableB" as unique_field) as Bx CROSS JOIN B) AS B
on A.unique_field=B.unique_field
| unique_field | a | b | c | d | unique_field | e | f | g | h | i | j |
|--------------|--------|--------|--------|--------|--------------|--------|--------|--------|--------|--------|--------|
| TableA | 1 | 1 | 1 | 1 | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| TableA | 2 | 2 | 2 | 2 | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| (null) | (null) | (null) | (null) | (null) | TableB | 8 | 8 | 8 | 8 | 8 | 8 |
| (null) | (null) | (null) | (null) | (null) | TableB | 9 | 9 | 9 | 9 | 9 | 9 |