组合两个没有公共字段的表

我想学习如何组合两个没有共同字段的数据库表。 我检查了联盟,但MSDN说:

以下是使用UNION组合两个查询的结果集的基本规则:

  1. 所有查询中列的数量和顺序必须相同。
  2. 数据types必须兼容。

但是我根本没有共同的领域。 我只想把它们合并在一张桌子里,就像一个景色。

所以我该怎么做 ?

提前致谢。

真诚。

有很多方法可以做到这一点,取决于你真正想要的。 没有共同的栏目,你需要决定是否要引入一个共同的栏目或获得产品。

假设你有两个表格:

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之间的列types兼容,或者通过使表格列兼容或强制select它们):

 > select id as pid, desc, '' as cid, '' as name from parts union select '' as pid, '' as desc, id as cid, name from custs; pid desc cid name --- ---- --- ---- 101 Bob 102 Paul 1 Sprocket 2 Flange 

在某些数据库中,可以使用rowid / rownum列或伪列来并排匹配logging,如:

 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子句限制了行如何组合以形成结果(所以根本不是笛卡儿的产品)。

我还没有testing过这个SQL,因为这是我select的DBMS的限制之一,所以我不相信这是正确的思维模式所需要的。 由于SQL不保证它生成数据的顺序,因此每次执行查询时,匹配都会更改,除非您有特定的关系或子句order by

我认为理想的做法是在两个表中添加一个列,指定关系是什么。 如果没有真正的关系,那么你可能没有尝试把它们与SQL并列。

如果你只是希望他们并排显示在一个报告或网页上(两个例子),那么正确的工具就是生成你的报告或网页,再加上两个独立的 SQL查询来获得两个不相关的表。 例如,BIRT(或Crystal或Jasper)中的两列网格,每个都有一个单独的数据表,或者一个HTML两列表(或CSS),每个表都有一个单独的数据表。

这是一个非常奇怪的要求,几乎可以肯定的是在现实应用程序中你永远不会想要做的事情,但是从纯粹的学术angular度来看,这是一个有趣的挑战。 在SQL Server 2005中,您可以使用公用表expression式和row_number()函数并join:

 with OrderedFoos as ( select row_number() over (order by FooName) RowNum, * from Foos (nolock) ), OrderedBars as ( select row_number() over (order by BarName) RowNum, * from Bars (nolock) ) select * from OrderedFoos f full outer join OrderedBars u on u.RowNum = f.RowNum 

这是有效的,但它是非常愚蠢的,我只提供它作为一个“社区wiki”的答案,因为我真的不会推荐它。

 SELECT * FROM table1, table2 

这将jointable1中的每一行与table2(笛卡尔积)返回所有列。

如果这些表没有共同的字段,那么没有办法在任何有意义的视图中组合数据。 你很可能最终会看到包含来自两个表的重复数据的视图。

要获得这两个表的有意义/有用的视图,通常需要从每个表中确定一个标识字段,然后可以在JOIN中的ON子句中使用该标识字段。

在你看来:

 SELECT T1.*, T2.* FROM T1 JOIN T2 ON T1.IDFIELD1 = T2.IDFIELD2 

你提到没有字段是“普通的”,但是虽然标识字段可能不具有相同的名称,或者甚至是相同的数据types,但是可以使用convert / cast函数以某种方式join它们。

你为什么不使用简单的方法

  SELECT distinct * FROM SUPPLIER full join CUSTOMER on ( CUSTOMER.OID = SUPPLIER.OID ) 

如果客户有3条logging,供应商有2条,那么它会给你所有来自这两个表的列,并返回来自客户和供应商的所有logging,然后供应商将在所有列中显示NULL

 select status_id, status, null as path, null as Description from zmw_t_status union select null, null, path as cid, Description from zmw_t_path; 
 SELECT t1.col table1col, t2.col table2col FROM table1 t1 JOIN table2 t2 on t1.table1Id = x and t2.table2Id = y 
 Select DISTINCT t1.col,t2col From table1 t1, table2 t2 OR Select DISTINCT t1.col,t2col From table1 t1 cross JOIN table2 t2 

如果它的拥抱数据,它需要很长的时间..

 select * from this_table; select distinct person from this_table union select address as location from that_table drop wrong_table from this_database; 

尝试:

 select * from table 1 left join table2 as t on 1 = 1; 

这将带来这两个表中的所有列。

请试试这个查询:

合并两个没有公共列的表:

 SELECT * FROM table1 UNION SELECT * FROM table2 ORDER BY orderby ASC