基本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。它按预期工作。再次感谢。。。。。。