基本sql查询帮助
这个例子被简化了。我的设计如下: 我插入了如下测试数据:基本sql查询帮助,sql,Sql,这个例子被简化了。我的设计如下: 我插入了如下测试数据: INSERT INTO Period VALUES ('Survey for 2011', 1) INSERT INTO EvalQuestion VALUES('How do...') INSERT INTO EvalQuestion VALUES('How many...') INSERT INTO EvalQuestion VALUES('Which is....') INSERT INTO EvalQuestion_Peri
INSERT INTO Period VALUES ('Survey for 2011', 1)
INSERT INTO EvalQuestion VALUES('How do...')
INSERT INTO EvalQuestion VALUES('How many...')
INSERT INTO EvalQuestion VALUES('Which is....')
INSERT INTO EvalQuestion_Period VALUES (1, 1)
INSERT INTO EvalQuestion_Period VALUES (1, 2)
INSERT INTO EvalQuestion_Period VALUES (1, 3)
INSERT INTO Employee VALUES ('Peter', 'Smith')
INSERT INTO Employee VALUES ('Britney', 'Spears')
INSERT INTO EvalAnswer VALUES(1,'Fine',1)
INSERT INTO EvalAnswer VALUES(2,'45',1)
INSERT INTO EvalAnswer VALUES(3,'I don´t know',1)
INSERT INTO EvalAnswer VALUES(1,'Fine again',2)
INSERT INTO EvalAnswer VALUES(2,'45 again',2)
INSERT INTO EvalAnswer VALUES(3,'I don´t know again',2)
Delete from EvalAnswer where ID= 1
Name Answer
-----------------------
How do.... NULL
How many... 45
Which is.... I don´t know
我运行以下查询以获取Peter的问题和答案:
Select Name, Answer
from EvalQuestion eq
LEFT JOIN EvalQuestion_Period eqp ON eq.Id = eqp.FK_EvalQuestion
LEFT JOIN EvalAnswer ea ON ea.FK_EvalQuestion_Period = eqp.Id
where ea.FK_Employee = 1
结果集:
Name Answer
-----------------------
How do... Fine
How many... 45
Which is.... I don´t know
这看起来不错。如果我删除Peters的一个答案,如下所示:
INSERT INTO Period VALUES ('Survey for 2011', 1)
INSERT INTO EvalQuestion VALUES('How do...')
INSERT INTO EvalQuestion VALUES('How many...')
INSERT INTO EvalQuestion VALUES('Which is....')
INSERT INTO EvalQuestion_Period VALUES (1, 1)
INSERT INTO EvalQuestion_Period VALUES (1, 2)
INSERT INTO EvalQuestion_Period VALUES (1, 3)
INSERT INTO Employee VALUES ('Peter', 'Smith')
INSERT INTO Employee VALUES ('Britney', 'Spears')
INSERT INTO EvalAnswer VALUES(1,'Fine',1)
INSERT INTO EvalAnswer VALUES(2,'45',1)
INSERT INTO EvalAnswer VALUES(3,'I don´t know',1)
INSERT INTO EvalAnswer VALUES(1,'Fine again',2)
INSERT INTO EvalAnswer VALUES(2,'45 again',2)
INSERT INTO EvalAnswer VALUES(3,'I don´t know again',2)
Delete from EvalAnswer where ID= 1
Name Answer
-----------------------
How do.... NULL
How many... 45
Which is.... I don´t know
然后运行相同的查询,我只得到两行,如下所示
Name Answer
-----------------------
How many... 45
Which is.... I don´t know
我需要我的问题在结果集中,即使没有答案,如下所示:
INSERT INTO Period VALUES ('Survey for 2011', 1)
INSERT INTO EvalQuestion VALUES('How do...')
INSERT INTO EvalQuestion VALUES('How many...')
INSERT INTO EvalQuestion VALUES('Which is....')
INSERT INTO EvalQuestion_Period VALUES (1, 1)
INSERT INTO EvalQuestion_Period VALUES (1, 2)
INSERT INTO EvalQuestion_Period VALUES (1, 3)
INSERT INTO Employee VALUES ('Peter', 'Smith')
INSERT INTO Employee VALUES ('Britney', 'Spears')
INSERT INTO EvalAnswer VALUES(1,'Fine',1)
INSERT INTO EvalAnswer VALUES(2,'45',1)
INSERT INTO EvalAnswer VALUES(3,'I don´t know',1)
INSERT INTO EvalAnswer VALUES(1,'Fine again',2)
INSERT INTO EvalAnswer VALUES(2,'45 again',2)
INSERT INTO EvalAnswer VALUES(3,'I don´t know again',2)
Delete from EvalAnswer where ID= 1
Name Answer
-----------------------
How do.... NULL
How many... 45
Which is.... I don´t know
有什么建议吗?谢谢每当您想从原始表返回一行或多行时,都可以使用外部联接。所以你的问题是:
Select Name, Answer
from EvalQuestion eq
LEFT JOIN EvalQuestion_Period eqp ON eq.Id = eqp.FK_EvalQuestion
LEFT OUTER JOIN EvalAnswer ea ON ea.FK_EvalQuestion_Period = eqp.Id
where ea.FK_Employee = 1
当不存在相应的记录时,这将为EvalAnswer中的值返回空值,但在其他情况下将与左联接完全相同。您的“左联接”实际上是一个左外联接(尽管有其他答案):联接类型由左
或右
表示,其中外
是可选的
当您使用ea.FK_Employee=1的时,您会将其更改为内部联接,因为您不允许缺少行。您需要首先进行筛选(即在加入之前限制EvalAnswer上的行)。这是因为WHERE是在逻辑上连接..之后处理的
使用派生的筛选表尝试此操作:
Select Name, Answer
from EvalQuestion eq
LEFT JOIN
EvalQuestion_Period eqp ON eq.Id = eqp.FK_EvalQuestion
LEFT JOIN
(SELECT * FROM EvalAnswer
where FK_Employee = 1
) ea ON ea.FK_EvalQuestion_Period = eqp.Id
或过滤器处于打开状态:
Select Name, Answer
from EvalQuestion eq
LEFT JOIN
EvalQuestion_Period eqp ON eq.Id = eqp.FK_EvalQuestion
LEFT JOIN
EvalAnswer ea ON ea.FK_EvalQuestion_Period = eqp.Id AND ea.FK_Employee = 1
-1因为这不应该有投票权。1“外部”是可选的2,其中将此更改为内部连接。是的,我应该对此进行更多思考。为了清晰起见,我总是使用outer
,但我忘了它是可选的。谢谢你,伙计。看起来这就是我需要的。我猜你是指最后一行:eqp.Id和ea.FK_Employee=1。它按预期工作。再次感谢。。。。。。