有很多方法可以做到这一点,具体取决于您真正想要什么。没有通用栏目,你需要决定是要引入通用栏目还是要产品。
假设你有两张桌子:
parts: custs:
+----+----------+ +-----+------+
| id | desc | | id | name |
+----+----------+ +-----+------+
| 1 | Sprocket | | 100 | Bob |
| 2 | Flange | | 101 | Paul |
+----+----------+ +-----+------+
忘记实际的列,因为在这种情况下您很可能拥有客户/订单/零件关系;我刚刚使用这些列来说明如何做到这一点。
笛卡尔积将第一个表中的每一行与第二个表中的每一行匹配:
> select * from parts, custs;
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
1 Sprocket 102 Paul
2 Flange 101 Bob
2 Flange 102 Paul
这可能不是您想要的,因为 1000 个零件和 100 个客户会导致 100,000 行包含大量重复信息。
或者,您可以使用联合来仅输出数据,但不能并排(您需要通过使表列兼容或强制它们来确保两个选择之间的列类型兼容在选择中):
> select id as pid, desc, null as cid, null as name from parts
union
select null as pid, null as desc, id as cid, name from custs;
pid desc cid name
--- ---- --- ----
101 Bob
102 Paul
1 Sprocket
2 Flange
在某些数据库中,您可以使用 rowid/rownum 列或伪列来并排匹配记录,例如:
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
2 Flange 101 Bob
代码类似于:
select a.id, a.desc, b.id, b.name
from parts a, custs b
where a.rownum = b.rownum;
它仍然像笛卡尔积,但where 子句限制了行组合以形成结果的方式(所以根本不是笛卡尔积,真的)。
我没有为此测试该 SQL,因为它是我选择的 DBMS 的限制之一,因此,我认为在经过适当考虑的架构中永远不需要它。由于 SQL 不保证其生成数据的顺序,因此每次执行查询时匹配都会发生变化,除非您有 特定 关系或 order by 子句。
我认为理想的做法是在两个表中添加一列,指定关系是什么。如果没有真正的关系,那么您可能没有必要将它们与 SQL 并排放置。
如果您只是希望它们在报告或网页上并排显示(两个示例),那么执行此操作的正确工具就是生成您的报告或网页,再加上两个独立 获取两个不相关的表的 SQL 查询。例如,BIRT(或 Crystal 或 Jasper)中的两列网格每个都有一个单独的数据表,或者一个 HTML 两列表(或 CSS)每个都有一个单独的数据表。