【发布时间】:2023-03-18 00:13:02
【问题描述】:
假设我有三张桌子:
User Table
{
UserId INT,
Username NVARCHAR
...
}
Questions
{
QuestionId INT
QuestionText NVARCHAR
}
Answers
{
AnswerId INT,
QuestionId INT,
UserId INT,
Answer NVARCHAR
}
这个结构显然被过度简化了,但是对于这个例子来说它应该足够了。
例如,选择对特定问题有特定答案的用户的最佳方法是什么 - 假设表格中填充了以下数据:
用户表
UserId Username ...
--------------------------------------------------------------------------------------------------------
1 User1 ...
2 User2 ...
3 User3 ...
4 User4 ...
5 User5 ...
6 User6 ...
7 User7 ...
8 User8 ...
9 User9 ...
10 User10 ...
... ... ...
etc
问题表
QuestionId QuestionText
--------------------------------------------------------------------------------------------------------
1 What is your favorite color?
2 What do you prefer cats or dogs?
3 Do you prefer if it is too hot or too cold?
4 What is your favorite season (Summer, Autumn (Fall), Winter, Spring)?
5 How Old Are you?
... ...
etc
答案表
AnswerId QuestionId UserId Answer
--------------------------------------------------------------------------------------------------------
1 1 1 Red
2 1 2 Red
3 1 3 Blue
4 1 4 Green
5 1 5 Black
6 2 6 Cats
7 2 1 Dogs
8 3 1 Too Cold
9 4 1 Spring
10 5 1 22
11 2 4 Dogs
12 3 4 Too Hot
13 3 3 Too Cold
14 5 6 46
15 1 8 Purple
如果我想选择喜欢狗和红色或紫色以及 50 岁以下等的用户
最好(最有效)的方法是从用户表到答案表有多个连接(每个答案条件需要一个)
例如:
如果我想获得喜欢狗和红色的用户,我可以使用以下 MSSQL:
SELECT *
FROM
Users
JOIN Answers As a1
ON Users.UserId = a1.UserId
JOIN Answers as a2
ON Users.UserId = a2.UserId
WHERE
(
a1.QuestionId = 1 AND
a1.Answer = 'Red'
) AND
(
a2.QuestionId = 2 AND
a2.Answer = 'Dogs'
)
可能有许多答案条件。
基本上,我要问的问题是编写查询的最佳方法是什么是您对来自同一个表的多行具有相同列的条件...
对不起,如果这令人困惑,请随时提出任何问题,我会尽力回答他们......
谢谢。
【问题讨论】:
-
对不起,如果这写得不好或措辞不好,这里已经过了午夜,我的清晰度很差,但我想,因为在其他地方是合理的时间,也许有人可以提供帮助。我之前问过一个类似的问题,但是随着我的理解的增加,我想知道这是否仍然是正确的答案,也许多个 UNION 选择就是答案……您可以在此处查看上一个问题的答案:stackoverflow.com/questions/9833056/…跨度>
-
啊。这很大程度上取决于(IME)的性能。有时,精心设计的联合会更快。
-
什么是临界点?如果想根据用户对 10 个甚至 20 个甚至 100 个问题的回答来获取用户?哪个提供最佳性能?也许它没有那么简单?...
-
我确实有一个想法,也许你可以告诉我它是否正确......如果我有一个包含来自用户的所有列的视图(例如称为 vw_users)会更快吗表以及每个问题的列(例如问题 1、问题 2),其中包含用户对每个问题的回答,这样我就可以使用简单的 Where 而无需连接...
-
好的,在这一点上我是在推测而不是给出一个硬性规定,但如果你在做类似 'WHERE Table1.FieldA = something OR Table1.FieldB = 别的东西'。您将能够使用两个单独的查询计划,而不是试图提出一个总体的查询计划。但是,如果同一字段的值总是不同的问题,ORs 可能也会这样做。不幸的是,这种情况可能需要进行实验。
标签: sql sql-server join