组合两个没有公共字段的表
我想学习如何组合两个没有共同字段的数据库表。 我检查了联盟,但MSDN说:
以下是使用UNION组合两个查询的结果集的基本规则:
- 所有查询中列的数量和顺序必须相同。
- 数据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