【问题标题】:Joining/Appending different tables together in Microsoft sql server在 Microsoft sql server 中将不同的表连接/附加在一起
【发布时间】:2014-09-16 04:22:33
【问题描述】:

大家好,我在 MS SQL SERVER 的数据库中有 3 个不同的表。

  1. LAB_patientreg
  2. 患者主控
  3. 患者地址

LAB_patientregpatient_master 是两个包含患者详细信息的表(两个表中的患者不同,LAB_patientreg 是关于患者的表谁直接在实验室注册,patient_master 是关于在接待处以 out patientin patient 的身份注册到医院的病人)和 patient_address 是包含在 patient_master 表中注册的患者地址的表。

在某些情况下,我需要所有患者的数据,包括 LAB_patientregpatient_master 以及 patient_address。我的目标是创建一个视图,其中包含此表中的所有值(即,如果 patient_master 有 50 行,LAB_patientreg 有 32 行,则结果视图应为 82 行)而且列的数量和类型仅限于 LAB_patientreg 但它不起作用,是否可以像我说的那样创建视图?如果不是,我应该怎么做才能获得这样的观点?提前感谢您帮助我。

表结构如下,

患者主控

CREATE TABLE [dbo].[patient_master](
    [pid] [int] IDENTITY(1,1) NOT NULL,
    [date_created] [date] NULL,
    [title] [varchar](25) NULL,
    [fname] [varchar](255) NULL,
    [mname] [varchar](255) NULL,
    [lname] [varchar](255) NULL,
    [addr_id] [int] NULL,
    [sex] [char](1) NULL,
    [dob] [date] NULL,
    [dobType] [tinyint] NULL,
    [marital_status] [int] NULL,
    [religion] [int] NULL,
    [caste] [int] NULL,
    [aadhar_no] [varchar](16) NULL,
    [mother_name] [varchar](100) NULL,
    [guardian_name] [varchar](100) NULL,
    [guardian_rltn] [varchar](100) NULL,
    [allow_sms] [varchar](10) NULL,
    [allow_email] [varchar](10) NULL,
    [occupation] [int] NULL,
    [monthly_income] [int] NULL,
    [financial_review_date] [datetime] NULL,
    [race] [int] NULL,
    [language] [int] NULL,
    [referrer] [varchar](100) NULL,
    [referrer_id] [varchar](100) NULL,
    [interpretter] [varchar](100) NULL,
    [interpretter_id] [varchar](100) NULL,
    [deceased_date] [date] NULL,
    [deceased_reason] [varchar](255) NULL,
    [created_by] [varchar](100) NULL,
    [changed_by] [varchar](100) NULL,
    [date_changed] [datetime] NULL,
    [voided] [tinyint] NULL,
    [voided_by] [varchar](100) NULL,
    [date_voided] [datetime] NULL,
    [void_reason] [varchar](255) NULL,
    [block] [tinyint] NULL,
    [aliasname] [varchar](50) NULL,
    [confidential] [int] NULL,
    [hospno] [char](8) NULL, PRIMARY KEY(pid)
);

患者地址

CREATE TABLE [dbo].[patient_address](
    [pres_house_no] [varchar](25) NULL,
    [pres_city] [varchar](50) NULL,
    [pres_street] [varchar](50) NULL,
    [pres_district] [int] NULL,
    [pres_pincode] [varchar](10) NULL,
    [perm_house_no] [varchar](25) NULL,
    [perm_city] [varchar](50) NULL,
    [perm_street] [varchar](50) NULL,
    [perm_district] [int] NULL,
    [perm_pincode] [varchar](10) NULL,
    [home_phone] [varchar](11) NULL,
    [mobile_phone] [varchar](11) NULL,
    [other_phone] [varchar](11) NULL,
    [work_phone] [varchar](11) NULL,
    [email] [varchar](255) NULL,
    [emerg_cntct] [varchar](50) NULL,
    [emerg_cntct_rltn] [varchar](50) NULL,
    [emerg_cntct_num] [varchar](11) NULL,
    [pres_place] [varchar](255) NULL,
    [perm_place] [varchar](255) NULL,
    [addr_id] [int] IDENTITY(1,1) NOT NULL,
    [pid] [int] NULL,
    [active] [char](1) NULL,
    [phone_type] [varchar](4) NULL, , PRIMARY KEY(addr_id)
);

LAB_patientreg

CREATE TABLE [dbo].[LAB_patientreg](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [patientid] [varchar](15) NOT NULL,
    [title] [varchar](15) NULL,
    [fname] [varchar](50) NULL,
    [mname] [varchar](50) NULL,
    [lname] [varchar](50) NULL,
    [dob] [smalldatetime] NULL,
    [gender] [char](2) NULL,
    [mstatus] [varchar](15) NULL,
    [idtype] [varchar](15) NULL,
    [idno] [varchar](25) NULL,
    [mtongue] [varchar](35) NULL,
    [address] [varchar](300) NULL,
    [phtype] [varchar](15) NULL,
    [phno] [varchar](20) NULL,
    [emailid] [varchar](50) NULL,
    [smsstatus] [int] NULL,
    [mailstatus] [int] NULL,
    [status] [int] NULL,
    [regcenter] [varchar](30) NULL,
    [regdate] [smalldatetime] NULL, PRIMARY KEY(patientid)
);

我已经尝试了以下

Select patientid,title, fname, mname, lname, NULL As religion from LAB_patientreg WHERE 1=1
Union All  
Select pid,title, fname, mname, lname, religion from patient 
INNER JOIN patient_address ON patient.pid = patient_address.pid WHERE 1=1 

执行此操作时,出现错误代码 209,SQL 状态 S1000: Ambiguous column name 'pid'"

【问题讨论】:

    标签: java sql sql-server database hibernate


    【解决方案1】:

    你可能想要一个 Union Select 在这里?

    在一个视图中包含两个表数据,并且能够向第二个表添加条件。应该是这样的:

    Select title, fname, mname, lname, NULL As religion,  patientid As pid from dbo.LAB_patientreg WHERE 1=1
    UNION  
    Select title, fname, mname, lname, religion, convert(varchar, patient_master.pid) As pid from dbo.patient_master 
    INNER JOIN patient_address ON patient_master.pid = patient_address.pid
    WHERE 1=1
    

    (只需将 where 1=1 替换为您的条件)

    使用 Union Select:确保 两个 表上的列名相同。如果其他表中没有该字段,可以使用AlternateFieldname As TheFieldNameINeed,例如字段Null As religion

    编辑:您可以使用Union 获取所有不同的值,也可以使用Union All 获取两个表的所有值。

    【讨论】:

    • 我需要映射 '[pid] [int] IDENTITY(1,1) NOT NULL' in '[dbo].[patient_master]' and '[patientid] [varchar](15) NOT NULL' in '[LAB_patientreg]'。但是出现这个错误“错误代码209,SQL状态S1000:不明确的列名'pid'”。你能帮帮我吗?
    • 哦,我明白了,在我的帖子中使用了 Edit2,也许可以。
    • Select patientid,title, fname, mname, lname, NULL As religion from LAB_patientreg WHERE 1=1 Union All Select pid,title, fname, mname, lname, religion from patient INNER JOIN patient_address ON patient.pid = patient_address.pid WHERE 1=1 执行时出现此错误,错误代码为 209,SQL 状态 S1000: Ambiguous column name 'pid'"
    • 哦,我明白了,您希望两者都在同一列。我会再次编辑。 - 您的确切错误来自您使用连接的第二个选择。您需要定义“pid”字段的来源,无论是患者地址还是患者主
    • 我已经监督了您的 patientID 是一个 varchar(15) 字段。我用转换编辑了我的帖子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多