EAV Select query from spreaded value tables

[亡魂溺海] 提交于 2019-12-07 23:01:30

问题


I have the following SQL Server database structure I have to use to query data. The model could be wrong; I appreciate arguments if that's the case so I can ask for changes. If not, I need a query to get tabbed data in the format I will detail below.

The structure goes like this:

CLIENTS:

ClientID    ClientName
-----------------------
1           James
2           Leonard
3           Montgomery

ATTRIBUTES:

AttributeID     AttributeName
-----------------------------
1               Rank
2               Date
3               Salary
4               FileRecordsAmount

ATTRIBUTES_STRING:

ClientID    AttributeID     AttributeStringValue
1           1               Captain
2           1               Chief Surgeon
3           1               Chief Engineer

ATTRIBUTES_NUMERIC:

ClientID    AttributeID     AttributeNumericValue
1           4               187
2           4               2
3           4               10

The result I need would be the following:

RESULTS:
----------------------------------------------------------
ClientID    ClientName  Rank            FileRecordsAmount
1           James       Captain         187
2           Leonard     Chief Surgeon   2
3           Montgomery  Chief Engineer  10

How can I achieve this?

Thank you very much!

EDIT: The challenging issue here (for me) is that the attributes are dynamic... I have 5 tables of attributes (ATTRIBUTES_STRING, ATTRIBUTES_NUMERIC, ATTRIBUTES_DATE, ATTRIBUTES_BIT, ATTRIBUTES_INT) and the user should be able to set up it's own attributes.


回答1:


You need an SQL join. It will look something like this:

select 
    CLIENTS.ClientID, 
    CLIENTS.ClientName, 
    ATTRIBUTES_STRING1.AttributeStringValue as Rank, 
    ATTRIBUTES_NUMERIC2.AttributeNumericValue as FileRecordsAmount
from 
    CLIENTS,
    ATTRIBUTES ATTRIBUTES1,
    ATTRIBUTES ATTRIBUTES2,
    ATTRIBUTES_STRING ATTRIBUTES_STRING1,
    ATTRIBUTES_NUMERIC ATTRIBUTES_NUMERIC2
where CLIENTS.ClientID = ATTRIBUTES_STRING1.ClientID
and CLIENTS.ClientID = ATTRIBUTES_NUMERIC2.ClientID
and ATTRIBUTES_STRING1.AttributeID = ATTRIBUTES1.AttributeID
and ATTRIBUTES_NUMERIC2.AttributeID = ATTRIBUTES2.AttributeID
and ATTRIBUTES1.AttributeName = 'Rank'
and ATTRIBUTES2.AttributeName = 'FileRecordsAmount'
;

Here is the SQL Fiddle for reference. This is my first EAV schema so I wouldn't put too much trust in it :)

Edit: Schema provided below for reference:

create table CLIENTS (
    ClientID integer primary key,
    ClientName varchar(50) not null
);

insert into CLIENTS values (1,'James');
insert into CLIENTS values (2,'Leonard');
insert into CLIENTS values (3,'Montgomery');

create table ATTRIBUTES (
    AttributeID integer primary key,
    AttributeName varchar(50) not null
);

create index ATTRIBUTE_NAME_IDX on ATTRIBUTES (AttributeName);

insert into ATTRIBUTES values (1,'Rank');
insert into ATTRIBUTES values (2,'Date');
insert into ATTRIBUTES values (3,'Salary');
insert into ATTRIBUTES values (4,'FileRecordsAmount');

create table ATTRIBUTES_STRING (
    ClientID integer,
    AttributeID integer not null,
    AttributeStringValue varchar(255) not null,
    primary key (ClientID, AttributeID)
);

insert into ATTRIBUTES_STRING values (1,1,'Captain');
insert into ATTRIBUTES_STRING values (2,1,'Chief Surgeon');
insert into ATTRIBUTES_STRING values (3,1,'Chief Engineer');

create table ATTRIBUTES_NUMERIC (
    ClientID integer,
    AttributeID integer not null,
    AttributeNumericValue numeric(10, 5) not null,
    primary key (ClientID, AttributeID)
);
insert into ATTRIBUTES_NUMERIC values (1,4,187);
insert into ATTRIBUTES_NUMERIC values (2,4,2);
insert into ATTRIBUTES_NUMERIC values (3,4,10);

Edit: Modified the select to make it easier to extend with extra attributes



来源:https://stackoverflow.com/questions/18679399/eav-select-query-from-spreaded-value-tables

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!