当两个表没有任何主外键关系时从中获取数据

时间:2012-08-09 09:33:04

标签: sql sql-server

我有两个表,数据源是A,B。我想从这些表中获取4列的数据。这两个表中都有4列。 'A'表可能有也可能没有一列或所有4列的值。但是肯定B表有所有这些值。因此,如果它存在于A中,我必须从中选择,否则我从B中选择。说Col1,Col2存在于A中,col3和col4不在A表中,那么它应该从A和col中获取col1,col2 3,col4来自B表。

我不擅长SQL。有人可以帮我弄这个吗?希望我的问题很明确。如果没有,请告诉我

3 个答案:

答案 0 :(得分:3)

如果存在,您可以使用LEFT OUTER JOIN在A中查找匹配项。如果匹配的行不存在,则B中的行仍将保留在查询中。如果A对其中一列有NULL值,则可以使用COALESCE()来回退该列的B值。

我从你的问题中不清楚你想用哪个标准来匹配A和B之间的行,但如果你填写这个细节,可能会有如下的查询。

SELECT COALESCE(A.col1,B.col1)
        , COALESCE(A.col2,B.col2)
        , COALESCE(A.col3,B.col3)
        , COALESCE(A.col4,B.col4)
FROM B
LEFT OUTER JOIN A
    ON A.id = B.id

答案 1 :(得分:1)

您可以在表之间没有关系的情况下进行连接。以下示例显示了我认为您的目标。

DECLARE @tableone TABLE(id int,FirstName varchar(50),Secondname varchar(50))
insert into @tableone values(1,null, null);
insert into @tableone values(2,null, 'Dev');
insert into @tableone values(3,'Arjun', null);
insert into @tableone values(4,'Jack', 'Bilalo');

DECLARE @tabletwo TABLE(id int,FirstName varchar(50),Secondname varchar(50))
insert into @tabletwo values(1,'John', 'cena');
insert into @tabletwo values(2,'Michel', 'Dev');
insert into @tabletwo values(3,'Arjun', 'Ramn');
insert into @tabletwo values(4,'Jack', 'Bilalo');

SELECT A.Id, COALESCE(A.FirstName,B.FirstName) As Firstname, COALESCE(A.Secondname,B.Secondname) As Secondname
FROM @tableone A
    JOIN @tabletwo B
        ON A.id = B.id

答案 2 :(得分:0)

Live Demo

http://sqlfiddle.com/#!3/dbcfe/1

示例代码

create table tableone(id int,FirstName varchar(50),Secondname varchar(50))
insert into tableone values(1,'John', 'cena');
insert into tableone values(2,'Michel', 'Dev');
insert into tableone values(3,'Arjun', 'Ramn');
insert into tableone values(4,'Jack', 'Bilalo');

create table tabletwo(id_tb1 int,"address" varchar(150))
insert into tabletwo values('1','Uk');
insert into tabletwo values('2','USA');
insert into tabletwo values('3','China');
insert into tabletwo values('4','India');

select a.FirstName,a.SecondName,b.address as location 
from tableone a inner join tabletwo b
on a.id=b.id_tb1