2011-06-09 32 views
0

我有一个数据库中的两个表,也就是说,carsbikes。他们都只有两个列idname像这样:选择两个表中的所有行没有一个外键属性

Bikes table(BikeID int, BikeName) 
Cars Table(CarId int, CarName) 

这两个表绝对没有肉体关系,(无外键等)没有主键,它真的只值一列。

我要选择两个表中的所有行。但如果他们有共同的名字,我想结合他们,就像这样:

Name  BikeId  CarId 
``````````````````````````````` 
Car1   null   1 
Car2   null   2 
Bike1  1   null 
Bike2  2   null 
BikeCar  3   5 

甚至有可能这样做吗? 我使用T-SQL(SQL Server 2008中)

感谢。

ps:我可以考虑制作两个tmp表,添加值,创建第三个临时表,使用while循环并检查每个产品等等。但我只是想知道是否有一个更短的方法来做到这一点... 谢谢。

编辑:我意识到我已经输入的问题没有想太多。改变。谢谢。

回答

8

相反,文章标题,这可以通过使用一个连接来完成。完整外部联接如果可能的话将返回来自两个表的所有结果连接在一起的,但如果连接标准不匹配,它将返回NULL为其他表的列(类似于做了左和右外同时加入)。

SELECT 
    ISNULL(Bikes.BikeName, Cars.CarName) AS Name, 
    Bikes.BikeId, 
    Cars.CarId 
FROM Bikes 
    FULL OUTER JOIN Cars ON Bikes.BikeName = Cars.CarName 
ORDER BY ISNULL(Bikes.BikeName, Cars.CarName) 
+0

在那里做得很好:-) – Elliveny 2011-06-09 16:37:58

+0

比我的回答好得多。感谢你的回答。 – 2011-06-09 16:38:40

+0

令人惊叹的,完美的作品。谢谢。这我不想要(我的意思是,我的下一个问题),但有可能把它放在视图中? – LocustHorde 2011-06-09 16:46:04

0
select BikeName as Name, BikeID, null as CarID from Bikes 
union all 
select CarName as Name, null as BikeID, CarID from Cars 

应该为你做。

+0

这是否涵盖了示例中的最后一行?酷,如果是这样。 – 2011-06-09 16:26:59

+0

啊,没有发现!不,它没有解决最后一个,错过了......哎呀。 – Elliveny 2011-06-09 16:29:12

+0

嗨,对不起,它做的事情就像独立选择它们,但只是追加它们! – LocustHorde 2011-06-09 16:44:02

0

尝试: -

SELECT 
    Name, MAX(BikeId) AS BikeId, MAX(CarId) AS CarId 
FROM 
(
    SELECT CarName AS Name, NULL AS BikeId, CarId FROM Cars 
    UNION 
    SELECT BikeName AS Name, BikeId, NULL AS CarId FROM Bikes 
) vehicles 
GROUP BY 
    NAME 
+0

这也适用;尽管可能不如完整的外部连接方法那样整齐。 – Elliveny 2011-06-09 16:39:04

+0

我正在阅读完整的外部联接的东西。看起来像一个有用的工具,在一个人的武器。它比我的解决方案也更快(只跑了两个就在那里,则:d) – 2011-06-09 16:41:46

+0

你好,不好意思,我们为什么要在这里使用最大? – LocustHorde 2011-06-09 16:43:33

相关问题