由于 SQL 查询返回二维行集,因此输出必须具有一致的列集。因此,不可能对几个显着不同的表发出一个查询,并生成包含所有相关表的所有列的输出,请参见脚注。如果您希望所有列都可用,例如SELECT *将产生的,您将需要发出 5 个单独的查询并分别从中获取行。
您现有的结构可以做什么:
使用您现有的结构,要获得所有这些相同的组合行集,您需要使用以下模式将它们链接在一起:UNION ALL
SELECT col1, col2 FROM health WHERE county = 'baawa'
UNION ALL
SELECT col1, col2 FROM hotspots WHERE county = 'baawa'
UNION ALL
SELECT col1, col2 FROM markets WHERE county = 'baawa'
UNION ALL....
SELECT col1, col2 FROM schools WHERE county = 'baawa'
UNION ALL
SELECT col1, col2 FROM security WHERE county = 'baawa'
/* ORDER BY applies to the whole rowset */
ORDER BY col2 DESC, col1 ASC
问题是,您只能以我在这里所做的简单方式使用此方法获取所有表共有的列。查看您的表结构,我看到的常见列是name, ward, location, lat, lon. 因此,您必须在每个UNION组件的SELECT.
请注意,我不在查询中使用SELECT *。UNION除非表完全相同,否则最初以完全相同的顺序定义列,SELECT *将不会以相同的顺序生成列,并且您的输出将没有意义,因为它们不会在UNION'd 表中对齐。
在进行UNION查询时,明确SELECT列表中列的顺序很重要。在您的情况下,这无论如何都是不可能的,因为这些表差异很大。
如果您需要在结果查询中包含并非所有表共有的一或两个其他列,您可以通过在该列不存在的组件中SELECT添加 aNULL在列表中执行此操作。UNION例如mgt_committee,它存在的 2 列和NULL不存在的列:
/* NULL as mgt_committee where column doesn't exist in table... */
SELECT col1, col2, NULL AS mgt_committee FROM health WHERE county = 'baawa'
UNION ALL
SELECT col1, col2, mgt_committee FROM hotspots WHERE county = 'baawa'
UNION ALL
SELECT col1, col2, mgt_committee FROM markets WHERE county = 'baawa'
UNION ALL
SELECT col1, col2, NULL AS mgt_committee FROM schools WHERE county = 'baawa'
UNION ALL
SELECT col1, col2, NULL AS mgt_committee FROM security WHERE county = 'baawa'
脚注:
将所有表中的所有列包含在一个中的唯一方法是SELECT像我一样列出所有表的超集mgt_committee,这意味着所有表中的所有列都必须在 的每个组件中表示UNION,并NULL替换不包含的列存在。不要这样做,这没有意义。