【问题标题】:Getting data from 2 tables when they dont have any primary-foregin key relationship当它们没有任何主外键关系时从2个表中获取数据
【发布时间】:2012-08-09 09:33:03
【问题描述】:

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

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

【问题讨论】:

  • 如你所说,如果表a中的某些内容丢失,则必须取表b的列。那么你应该怎么知道,你必须取表 b 的哪一行呢?应该有一个列(或更多的组合)使一行唯一,或者至少与另一个表中的一行相关。
  • 他们必须获取一个在两个表中都是唯一的公共 ID

标签: sql sql-server


【解决方案1】:

您可以使用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

【讨论】:

  • 我可能错了,但是如果您使用的是连接,它们不应该通过主键外键关联吗?
  • 在使用连接时会有这样的关系是很常见的,但 SQL Server 不需要。但是,如果由于某些特定原因无法建立 FK 关系,您可能需要谨慎确保连接不会匹配比预期更多的行。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    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 
    

    【讨论】:

    • 我认为你误解了这个问题
    • 我认为 innerjoin 在这里会有所帮助,因为它需要 2 个源表之间的关系
    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2014-08-11
    • 2015-04-11
    • 2014-11-07
    • 2017-09-06
    • 2021-05-25
    相关资源
    最近更新 更多