繁体   English   中英

复杂在SQL Server中为事实表连接多个表

[英]Complex Joining multiple tables in SQL Server for a fact table

嗨我有4个维度,我试图将维度中的多个数据插入到事实表中。

我有一个Gunsales表,其中包含事实表的大部分数据,然后包含我想要加入的其他表的主键。 来自Homicide表的homicide_id,来自BBC表的article_id,来自Gun_violence表的incident_id和来自School_shooting表的shooting_id。 其余数据来自Gunsales表。

INSERT INTO [dbo].[FactGunSales]
        (
        sale_id,
        sale_date,
        sale_state,
        permit,
        hand_gun,
        long_gun,
        other_gun,
        multiple_gun,
        incident_id,
        homicide_id,
        article_id,
        shooitng_id)

所以逻辑上它是Gun_sales表的完全连接和另一个表中ID键的内部连接,但我很难让它工作。

为所有表添加DDL:

    USE [Gun Violence]
GO

DROP TABLE IF EXISTS Gun_Violence

CREATE TABLE Gun_Violence(
        incident_id int PRIMARY KEY, 
        incident_date date,
        state_name varchar (50),
        city_name varchar(50),
        death int ,
        injury int ,
        )

DROP TABLE IF EXISTS Gun_Sales
CREATE TABLE  Gun_Sales(
            sale_id int  PRIMARY KEY,
            sale_date date,
            sale_state varchar(50),
            permit int,
            hand_gun int ,
            long_gun int ,
            other_gun int ,
            multiple_gun int ,
            )

DROP TABLE IF EXISTS School_Shootings
CREATE TABLE School_Shootings(
            shooting_id int  PRIMARY KEY,
            shooting_date date,
            shooting_state varchar(50),
            shooting_city varchar(50),
            shooting_death int ,
            shooting_injury int,
            )

DROP TABLE IF EXISTS Homicide
CREATE TABLE Homicide(
            Homicide_id int PRIMARY KEY,
            homicide_state varchar(50),
            homicide_victims int,
            homeicide_date date             
)

DROP TABLE IF EXISTS BBC
CREATE TABLE BBC(
            ariticle_id int PRIMARY KEY,
            article_date date,
            article_link varchar(1000),
            article_headline varchar(1000),
            article_count int,
            article_keyword varchar(100),
            article_month varchar(10),
            article_year int,
            article_state varchar(50)
)

输出: 输出枪 如上所述,我试图创建一个新的事实表,其中包含Gun_sales表中的所有列和来自其他表的主键。

提前致谢

@RitaMurran是不是真的? 你想要这样的东西吗?

USE [Gun Violence]

go

INSERT INTO [dbo].[FACTGUNSALES]
            ([sale_id],
             [sale_date],
             [sale_state],
             [hand_gun],
             [other_gun],
             [multiple_gun],
             [incident_id],
             [homicide_id],
             [article_id],
             [shooitng_id])
SELECT [sale_id],
       [sale_date],
       [sale_state],
       [hand_gun],
       [other_gun],
       [multiple_gun],
       [dbo].[GUN_VIOLENCE].incident_id,
       [dbo].[HOMICIDE].homicide_id,
       [dbo].[BBC].ariticle_id,
       [dbo].[SCHOOL_SHOOTINGS].shooting_id
FROM   [dbo].[GUN_SALES]
       LEFT JOIN [dbo].[GUN_VIOLENCE]
         ON ( [dbo].[GUN_VIOLENCE].incident_date = [dbo].[GUN_SALES].[sale_date] AND
              [dbo].[GUN_VIOLENCE].state_name = [dbo].[GUN_SALES].[sale_state] )
       LEFT JOIN [dbo].[SCHOOL_SHOOTINGS]
         ON ( [dbo].[SCHOOL_SHOOTINGS].shooting_date = [dbo].[GUN_SALES].[sale_date]     AND
              [dbo].[SCHOOL_SHOOTINGS].shooting_state = [dbo].[GUN_SALES].    [sale_state] )
       LEFT JOIN [dbo].[HOMICIDE]
         ON ( [dbo].[HOMICIDE].homeicide_date = [dbo].[GUN_SALES].[sale_date] AND
              [dbo].[HOMICIDE].homicide_state = [dbo].[GUN_SALES].[sale_state] )
       LEFT JOIN [dbo].[BBC]
         ON ( [dbo].[BBC].article_date = [dbo].[GUN_SALES].[sale_date] AND
              [dbo].[BBC].[article_state]  = [dbo].[Gun_Sales].[sale_state] ) 

编辑:

@RitaMurran,我回答你的问题:

“当连接发生时,有没有办法只有不同的值?”

用例子:

DECLARE @tbl_A TABLE (ID_A INT, col_A varChar(10))
INSERT  @tbl_A (ID_A,col_A)
SELECT 1 AS ID_A,'aaa' AS  col_A UNION ALL
SELECT 2        ,'bbb'           UNION ALL
SELECT 3        ,'ccc'           UNION ALL
SELECT 4        ,'ddd'           UNION ALL
SELECT 5        ,'eee'

DECLARE @tbl_B TABLE (ID_B INT,ID_A_FK INT, col_B varChar(10))
INSERT  @tbl_B (ID_B,ID_A_FK,col_B)
SELECT 1 AS ID_B,1 AS ID_A_FK,NULL AS  col_B UNION ALL
SELECT 2        ,1           ,NULL           UNION ALL
SELECT 3        ,3           ,NULL           UNION ALL
SELECT 4        ,3           ,NULL           UNION ALL
SELECT 5        ,3           ,NULL

SELECT * 
FROM @tbl_A tbA
LEFT JOIN 
    ( select ID_A_FK,col_B FROM @tbl_B GROUP BY ID_A_FK,col_B )  tbB ON     tbA.ID_A = tbB.ID_A_FK  

输出:

ID_A    col_A   ID_A_FK col_B
1       aaa     1       NULL
2       bbb     NULL    NULL
3       ccc     3       NULL
4       ddd     NULL    NULL
5       eee     NULL    NULL  

如果col_B有值,则输出如下:

INSERT  @tbl_B (ID_B,ID_A_FK,col_B)
SELECT 1 AS ID_B,1 AS ID_A_FK,'a1' AS  col_B UNION ALL
SELECT 2        ,1           ,'a2'           UNION ALL
SELECT 3        ,3           ,'c1'           UNION ALL
SELECT 4        ,3           ,'c2'           UNION ALL
SELECT 5        ,3           ,'c3'  

输出:

ID_A    col_A   ID_A_FK col_B
1       aaa     1       a1
1       aaa     1       a2
2       bbb     NULL    NULL
3       ccc     3       c1
3       ccc     3       c2
3       ccc     3       c3
4       ddd     NULL    NULL
5       eee     NULL    NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM