Database lookup for each value of another database lookup

别来无恙 提交于 2020-01-17 06:16:30

问题


I am not sure how to exactly word this as I have just started SQL and have just finished going over simple joins.

Ill start with my tables first:

tblQuestions

| Survey ID | User ID | Entry Date | Question 1 | Question 2 | Question 3 | Question 4 |
|     1     |   305   |    date    |      0     |      1     |     2      |      3     | 

tblValues

|  VID  | TextValue |
|   0   |   Never   |
|   1   |   Rarely  |
|   2   | Sometimes |
|   3   |   Often   |

I want an SQL query that outputs the TextValues of each questions VID. I can't store the text values directly because the data will be exported for charts. Also I from what I understand repetitive data is bad table design and rule for when to normalize tables.

Is this possible through a single query?

EDIT: I am using MS Access. Desired output:

| Survey ID | User ID | Entry Date | Question 1 | Question 2 | Question 3 | Question 4 |
|     1     |   305   |    date    |    Never   |   Rarely   |  Sometimes |    Often   | 

回答1:


You want to join one survey record with four answer records, so you must query the answer table four times. Use table aliases in order to distinguish the four records:

select 
  q.survey_id, q.user_id, q.entry_date,
  v1.textvalue, v2.textvalue, v3.textvalue, v4.textvalue
from tblQuestions q
join tblValues v1 on v1.vid = q.question1
join tblValues v2 on v2.vid = q.question2
join tblValues v3 on v3.vid = q.question3
join tblValues v4 on v4.vid = q.question4;

UPDATE: Access has some additional join requirements, as Chris has pointed out. So above standard SQL query has to be modified thus:

select 
  q.survey_id, q.user_id, q.entry_date,
  v1.textvalue, v2.textvalue, v3.textvalue, v4.textvalue
from (((tblQuestions q
inner join tblValues as v1 on v1.vid = q.question1)
inner join tblValues as v2 on v2.vid = q.question2)
inner join tblValues as v3 on v3.vid = q.question3)
inner join tblValues as v4 on v4.vid = q.question4;



回答2:


Just as a start:

CREATE TABLE Survey(ID INT NOT NULL IDENTITY CONSTRAINT PK_Survey PRIMARY KEY
                   ,BeginOfSurvey DATETIME NOT NULL);
CREATE TABLE Value(ID INT NOT NULL IDENTITY CONSTRAINT PK_Value PRIMARY KEY
                  ,Caption VARCHAR(100) NOT NULL);
CREATE TABLE QuestionText(ID INT NOT NULL IDENTITY CONSTRAINT PK_QuestionText PRIMARY KEY
                     ,Caption VARCHAR(100) NOT NULL);
CREATE TABLE Question(ID INT NOT NULL IDENTITY CONSTRAINT PK_Question PRIMARY KEY
                     ,SurveyID INT NOT NULL CONSTRAINT FK_Question_SurveyID FOREIGN KEY REFERENCES Survey(ID)
                     ,QuestionTextID INT NOT NULL CONSTRAINT FK_Question_QuestionTextID FOREIGN KEY REFERENCES QuestionText(ID)
                     ,ValueID INT NOT NULL CONSTRAINT FK_Question_ValueID FOREIGN KEY REFERENCES Value(ID));
INSERT INTO Value VALUES
 ('Never')
,('Rarely')
,('Sometimes')
,('Often');

INSERT INTO QuestionText VALUES
 ('Do you smoke?') 
,('Do you drink  alcohol?'); 

INSERT INTO Survey VALUES(GETDATE());

INSERT INTO Question VALUES
 (1,1,2) 
,(1,2,3);

SELECT *
FROM Survey AS s
INNER JOIN Question AS q ON s.ID=q.SurveyID
INNER JOIN QuestionText AS qt ON qt.ID=q.QuestionTextID
INNER JOIN Value AS v ON v.ID=q.ValueID 


来源:https://stackoverflow.com/questions/35079603/database-lookup-for-each-value-of-another-database-lookup

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