问题
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