【问题标题】:Using coalesce to create a view使用合并创建视图
【发布时间】:2014-08-20 21:49:03
【问题描述】:

我正在使用以下脚本从 3 个表创建一个视图。当在 MUES_OUT_2010_07 和 MUES_DME_2010_07 而不是在 MUES_PHY_2010_07 中找到 HCPCS 时,我遇到了问题

CREATE VIEW MUES AS
SELECT COALESCE(TPHY.HCPCS, TOUT.HCPCS, TDME.HCPCS) AS HCPCS
, COALESCE(UNITS_PHY, -1) AS UNITS_PHY
, COALESCE(UNITS_OUT, -1) AS UNITS_OUT
, COALESCE(UNITS_DME, -1) AS UNITS_DME
FROM MUES_PHY_2010_07 TPHY
FULL OUTER JOIN MUES_OUT_2010_07 TOUT
ON TPHY.HCPCS = TOUT.HCPCS
FULL OUTER JOIN MUES_DME_2010_07 TDME
ON TPHY.HCPCS = TDME.HCPCS
GO

我的表格如下所示

CREATE TABLE [dbo].[MUES_OUT_2010_07](
    [HCPCS] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [UNITS_OUT] [smallint] NULL,
    CONSTRAINT [PK_MUES_OUT_2010_07] PRIMARY KEY CLUSTERED 
(
    [HCPCS] ASC
)WITH FILLFACTOR = 90 ON [PRIMARY]
) ON [PRIMARY]
GO

  CREATE TABLE [dbo].[MUES_DME_2010_07](
        [HCPCS] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
        [UNITS_DME] [smallint] NULL,
        CONSTRAINT [PK_MUES_DME_2010_07] PRIMARY KEY CLUSTERED 
    (
        [HCPCS] ASC
    )WITH FILLFACTOR = 90 ON [PRIMARY]
    ) ON [PRIMARY]
    GO

CREATE TABLE [dbo].[MUES_PHY_2010_07](
            [HCPCS] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [UNITS_PHY] [smallint] NULL,
            CONSTRAINT [PK_MUES_DME_2010_07] PRIMARY KEY CLUSTERED 
        (
            [HCPCS] ASC
        )WITH FILLFACTOR = 90 ON [PRIMARY]
        ) ON [PRIMARY]
        GO

insert into MUES_OUT_2010_07 select 'E1036', 1
insert into MUES_DME_2010_07 select 'E1036', 1

我希望视图创建一条如下所示的记录,因为 HCPCS 'E1036' 不在 MUES_PHY_2010_07 表中

HCPCS UNITS_PHY UNITS_OUT UNITS_DME

E1036 -1 1 1

但它会创建如下两条记录

E1036 -1 -1 1

E1036 -1 1 -1

我在视图中做错了什么

【问题讨论】:

  • 我认为问题不在于合并。我认为这与两个完整的外部连接有关。要么没有足够的唯一条件在连接上只生成一行,要么一个表意外地有 2 条记录,而您只有一条记录。

标签: sql sql-server-2005 coalesce


【解决方案1】:

您使用的是full outer join。这意味着您必须小心,因为 any 表中可能缺少值。特别是,当您到达第三张表时,on 条件需要参考 both 前面的表,以防缺少其中一个。

所以,这可能会解决您的问题:

CREATE VIEW MUES AS
    SELECT COALESCE(TPHY.HCPCS, TOUT.HCPCS, TDME.HCPCS) AS HCPCS,
           COALESCE(UNITS_PHY, -1) AS UNITS_PHY,
           COALESCE(UNITS_OUT, -1) AS UNITS_OUT,
           COALESCE(UNITS_DME, -1) AS UNITS_DME
    FROM MUES_PHY_2010_07 TPHY FULL OUTER JOIN
         MUES_OUT_2010_07 TOUT
         ON TPHY.HCPCS = TOUT.HCPCS FULL OUTER JOIN
         MUES_DME_2010_07 TDME
         ON COALESCE(TPHY.HCPCS, TOUT.HCPCS) = TDME.HCPCS;

【讨论】:

  • 是的。 @user176047 如果您大量简化场景,您可能会发现它更容易遵循,例如删除 COALESCE 和所有列(因为它是你想要不同的行数,你可以更改为 select * 直到你得到正确的行)。
  • 感谢@Gordon Linoff。最后的 Coalesce 解决了问题,简化了场景让我明白了。
  • @user176047 。 . .全外连接比看起来更复杂。有时它们是必要的。我可能会使用union allgroup by 来解决您的问题——尽管连接可能会执行得更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多