问答

sql – 来自两个不同表中的任何一个的引用键

 来源    2019-05-21    1  

我有以下两个表:

employees(id, name, address, designation, salary, phone, email...)

business_men(id, business_type, business_name, turn_over, phone, email,...)

现在我有另一个表客户端.我的客户可以是employee或business_man类型.
所以我有如下的客户端表:

Clients(id, code_number, type, reference_id)

类型字段可以存储’employee’或’business_man’,而reference_id是Type字段中提到的表的id.客户端的ID在许多地方的整个应用程序中使用.

我的问题是:

>我做得对吗?
>有更好/更有效的方法吗?
>如何使用单个SQL查询获取客户端的完整详细信息(给定客户端ID)?

我们使用的略有不同的方法是创建一个抽象实体表.其目的是为所有具体实体提供唯一的序列号.简化示例如下

--CREATE SCHEMA user893847

CREATE TABLE user893847.BASE_ENTITY
(
    entity_id int identity(1,1) NOT NULL PRIMARY KEY
)

CREATE TABLE user893847.EMPLOYEE
(
    entity_id int NOT NULL PRIMARY KEY
,   name_first varchar(30) NOT NULL
,   name_last varchar(30) NOT NULL
)

CREATE TABLE user893847.BUSINESS_PERSON
(
    entity_id int NOT NULL PRIMARY KEY
,   company_name varchar(30) NOT NULL
)

CREATE TABLE user893847.ADDRESS
(
    entity_id int NOT NULL
,   address_line1 varchar(70) NOT NULL
)

我们的插入方法将插入BASE_ENTITY表并捕获生成的id值.具体表(employee,business_person)会将结果id存储为PK.其中一个主要原因是我们的业务,营销,可以让我们移动实体表,因为我们了解更多关于他们或重新分类个人.如果实体478在整个域中是“相同的”,我们发现它简化了逻辑.而不是必须根据您的设计中的类型进行查询,因为在每个表中重新定义了一个数字,您查询只是连接到表,如果行返回,则它是该类型.

-- your query
SELECT
    C.*
,   E.*
    -- build out a null set of colums for business men
,   NULL AS id
,   NULL AS business_type
FROM
    Clients C
    INNER JOIN
        Employees E
        ON E.id = C.reference_id
WHERE
    C.type = 'employees'
UNION ALL

SELECT
    C.*
    -- repeat the build out for faking the employee columns
,   NULL AS id
,   NULL AS name
,   ...
,   BM.*
FROM
    Clients C
    INNER JOIN
        business_men BM
        ON BM.id = C.reference_id
WHERE
    C.type = 'employees'

-- my aproach
SELECT
    C.*
,   E.*
    -- build out a null set of colums for business men
,   NULL AS id
,   NULL AS business_type
,   ...
FROM
    Clients C
    INNER JOIN
        Employees E
        ON E.id = C.reference_id
UNION ALL

SELECT
    C.*
    -- repeat the build out for faking the employee columns
,   NULL AS id
,   NULL AS name
,   ...
,   BM.*
FROM
    Clients C
    INNER JOIN
        business_men BM
        ON BM.id = C.reference_id

如果您对设计有疑问,请与我们联系

sql – 从两个现有表中创建一个具有每种组合可能性的新表
问答我有两个临时表#a和#b都填充了整数值.假设它们都包含10行,值为1-10. 我想创建一个第三个临时表#c,其中包含a和b的所有可能组合.所以它总共有100行(1,1),(1,2)--(10,10). ...
1
sql – 计算两个不同表中两行之间的差异
问答我有两个表格,结构如下 表一 ╔════╦═══════════╦═══════╦══╗ ║ ID ║ Date ║ value ║ ║ ╠════╬═══════════╬═══════╬══╣ ║ ...
1
sql – 在两个数据库表中使用循环引用是一个好习惯
问答在我们的数据库中,我们有两个表A,B,主键为A_id和B_id. 将B_id作为表A中的外键和A_id作为表B中的外键是一种良好的做法.这将允许我们在表中具有多对多关系. 另一种方法是使第三个桥表只包 ...
1
sql – 显示两个不同表中的所有列
问答如何将两个不同表的所有列显示为ONE? 我在MovieDB中有两个表,电影和movie_actors.电影的id是主键,movie_actor的id是外键,movies_actor.id被引用到mov ...
1
sql – 如何比较两个相同表中的行并返回缺少行的结果集?
问答我查看了所有相关问题,但没有一个完全符合我的需要.我有两个结构相同的表(id,VoucherNbr,BalanceInit) – 一个来自我们当前的生产系统(tableA),另一个来自客户的遗留系统( ...
1
sql – 根据第三个表中定义的关系连接两个表
问答我有两个表活动和行动.可以为活动执行一个或多个操作.并且Activity和Action之间的关系在称为Activity Action的第三个表中给出. 如何检索结果集,告诉我使用sql语句对每个活动应 ...
1
sql – 为什么我在同一个表中的两个日期之间选择不起作用?
问答我使用SQL Server 2014,我尝试以下查询在同一个表中的两个日期之间进行选择,数据类型是nvarchar,我执行了以下查询它只显示了三行这样的行('30 / 03/2015′,'30 / 0 ...
1
如何从SQL中的两个不同表中选择值
问答我的SQL Server数据库中有两个表.第一个是Test1,第二个是Test2.两个表中都有一列RegNo. 现在我想从两个表中为特定的RegNo选择值. 这就是我正在做的事情 SELECT Tes ...
1
php – SQL SELECT仅包含两个不同表中列的MAX值的行
问答我的两个表设置如下: 表格1 +------+---------+--------------------------------------+ | id | tail | content | +-- ...
1
sql – 将数据合并到两个目标表中
问答我需要将来自捐赠者表的数据合并到两个目标表中.结构如下.如果在跟踪表中找不到projid,我需要在组件表中创建新组件并使用新id插入到跟踪表中.此外,对于捐赠者表中不再存在的那些项,跟踪表" ...
1
Tricky Rails ActiveRecord(SQL是可以接受的!)查询在两个连接表中查找给定条件的用户比例
问答class User < ActiveRecord::Base has_many :views has_many :rates ... end class Resource < Activ ...
1
对两个表的SQL查询 – 返回一个表中没有另一个表的行
问答我有两个数据库表,Categories和SuperCategories,用于我正在研究的库存控制系统: 类别:ID_Category,CategoryName 超类别:ID_SuperCategory ...
1
sql – 从表中选择另一个表中不存在两列的记录
问答我有Table1: Id Program Price Age 12345 ABC 10 1 12345 CDE 23 3 12345 FGH 43 2 12346 ABC 5 4 12346 CDE ...
1
sql – 如何查询两个不同表中两列的最大值?
问答我有一个要求. 我有两个表说TableA和TableB.两者都有一个名为"rec_id"的列.我的要求是使用单个查询获取这两列中包含的最大值. 例如:在TableA中,我的&quo ...
2
sql如何选取两个数据表中的值
日志一.直接在要选择的数据前面加上数据表的名字就行了 SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Order ...
1
sql – 如何删除表中具有另一个表中相应记录的所有记录
问答我有两个表A和B.我想删除在以下查询中返回的表A中的所有记录: SELECT A.* FROM A , B WHERE A.id = B.a_id AND b.date < '2008-10-1 ...
3
sql – 将所有列(在表中)中的所有零(如果有)更改为…说1
问答我有一个18列(所有Ints)和1040行的表.如果任何值为零我想将其更改为1.我正在使用Postgresql.做这个的最好方式是什么.我无法想出一个简单的更新声明--我是DB的新手. 关于我应该学习 ...
sql – 将一个字段从表复制到同一个表中的另一个字段
问答我使用此查询从同一个表中复制一个完整列: UPDATE 'content_type_chapter' SET 'field_chapternumbersort2_value' = 'field_cha ...
3
sql – 使用SELECT * INTO时新表中的数据类型更改
问答我正在开发一个查询,将表结构从链接服务器复制到本地数据库中,以获得通用的表列表. 但是由于某种原因,十进制数据类型将更改为数字.在选择过度链接的服务器时,似乎只会发生这种情况.但是,当我在本地系统上尝 ...
1