SQL视图:连接表而不会导致数据在每一行上复制?

Chr*_*her 3 sql-server join view duplicates sql-server-2008

每当我创建3个表的视图时,它都会复制所有行上的所有数据.我不知道如何连接这些,以便它显示空值而不是重复.你能直接指出我吗?

这是场景:

  • 表1 =帐户:帐户名称和帐户ID
  • 表2 =属性:属性描述,属性地址和帐户ID
  • 表3 =车辆:车辆制造,车辆型号和帐户ID

数据看起来像这样:

[Table 1= Accounts]
   id name  accountid

   1 Family A  account001
   2 Family B  account002
   3 Family C  account003



[Table 2= Properties]
  id accountid  description address

  1 account001 home california
  2 account001  beach mexico
  3 account002  hideout arizona
  4 account002  getaway nevada
  5 account002  skilodge idaho
  6 account 003  home texas


[Table 3= Vehicles]

 id description make model accountid
  1 green  Acura Integra  account001
  2 blue  Aston Martin Vantage account001
  3 silver  Audi Quattro  account001
  4 work  Bently Continental GTC account002
  5 kids  Ford Fusion Hybrid account002
  6 Mom's Car  Land Rover LR4 account003
  7 Paper Weight Mini Clubman account003
  8 Beater  Dodge Caliber  account003
  9 Why Mahindra TR40 account003
  10 Kids  Scion xB  account003
Run Code Online (Sandbox Code Playgroud)

我的愿望是创建一个视图,向我显示数据库中的所有记录.对于每一行,我想显示帐户名称,然后显示表格中的数据.

我正在寻找视图返回如下所示的结果:如果该数据不是来自当前查询的列,它就不会在行上显示数据.

account_Name | property_DESCRIPTION | property_ADDRESS | vehicles_DESCRIPTION   vehicles_MAKE | vehicles_MODEL

- Family A  home    california  **null  null    null**
- Family A  beach   mexico  **null  null    null**
- Family A  **null  null**  blue    Aston Martin    Vantage
- Family A  **null  null**  silver  Audi    Quattro
- Family B  hideout arizona **null  null    null**
- Family B  getaway nevada  **null  null    null**
- Family B  skilodge    idaho   **null  null    null**
- Family B  **null  null**  kids    Ford    Fusion Hybrid
Run Code Online (Sandbox Code Playgroud)

但相反,它显示重复的数据,如下所示,每次找到新记录时,它会使用其他表中的数据填充行.

account_Name    property_DESCRIPTION    property_ADDRESS    vehicles_DESCRIPTION    vehicles_MAKE   vehicles_MODEL

- Family A  home    california  green   Acura   Integra
- Family A  beach   mexico  green   Acura   Integra
- Family A  home    california  blue    Aston Martin    Vantage
- Family A  beach   mexico  blue    Aston Martin    Vantage
- Family A  home    california  silver  Audi    Quattro
- Family A  beach   mexico  silver  Audi    Quattro
- Family B  hideout arizona work    Bently  Continental GTC
- Family B  getaway nevada  work    Bently  Continental GTC
- Family B  skilodge    idaho   work    Bently  Continental GTC
- Family B  hideout arizona kids    Ford    Fusion Hybrid
- Family B  getaway nevada  kids    Ford    Fusion Hybrid
- Family B  skilodge    idaho   kids    Ford    Fusion Hybrid
Run Code Online (Sandbox Code Playgroud)

为什么这种情况似乎对我有意义; 一切都在加入.就好像连接一样,无论成本如何,他们都需要显示数据.从脚本的角度来看,似乎不是连接,而是需要单独循环遍历表,然后将生成的循环连接在一起.

本质上我需要视图首先显示表1中的所有记录,然后是表2中的所有记录,然后是表3中的所有记录.我真的不想将这些数据连接在一起; 我只想在一个视图中看到它.

任何人都可以告诉我如何生成上面显示空值而不是重复的所需视图?

这是在SQL 2008 R2 Enterprise上.

Joe*_*lli 6

在这种情况下,您需要使用UNION(实际上是UNION ALL).

select a.name as account_Name, 
       p.description as property_DESCRIPTION, 
       p.address as property_ADDRESS, 
       null as vehicles_DESCRIPTION,
       null as vehicles_MAKE, 
       null as vehicles_MODEL
    from Accounts a
        inner join Properties p
            on a.accountid = p.accountid
UNION ALL   
select a.name as account_Name, 
       null as property_DESCRIPTION, 
       null as property_ADDRESS, 
       v.description as vehicles_DESCRIPTION,
       v.make as vehicles_MAKE, 
       v.model as vehicles_MODEL
    from Accounts a
        inner join vehicles v
            on a.accountid = v.accountid
Run Code Online (Sandbox Code Playgroud)