假设我有这样的结构:
RecipeID
Name
Description
Run Code Online (Sandbox Code Playgroud)
RecipeID
IngredientID
Quantity
UOM
Run Code Online (Sandbox Code Playgroud)
关键RecipeIngredients是(RecipeID, IngredientID)。
有哪些查找重复食谱的好方法?重复配方被定义为具有完全相同的一组成分和每种成分的数量。
我想过使用FOR XML PATH将成分组合到一个列中。我还没有完全探索这个,但如果我确保成分/UOM/数量按相同的顺序排序并且有一个合适的分隔符,它应该可以工作。有更好的方法吗?
有 48K 食谱和 200K 成分行。
sql-server-2008 database-design sql-server relational-division
我有一个执行大量重复工作的查询:
SELECT visitor_id, '1'::text AS filter
FROM events
WHERE id IN (SELECT event_id FROM params
WHERE key = 'utm_campaign' AND value = 'campaign_one')
AND id IN (SELECT event_id FROM params
WHERE key = 'utm_source' AND value = 'facebook')
GROUP BY visitor_id
UNION ALL
SELECT visitor_id, '2'::text AS filter
FROM events
WHERE id IN (SELECT event_id FROM params
WHERE key = 'utm_campaign' AND value = 'campaign_two')
AND id IN (SELECT event_id FROM params
WHERE key = 'utm_source' AND value = 'facebook') …Run Code Online (Sandbox Code Playgroud) 抱歉,如果之前已经问过这个问题。我找不到任何例子。
我试图将学生的课程作业拉出一个学期,前提是他们在所有课程中都获得了“NA”的成绩。现在,我的代码只吸引在任何课程中成绩为“NA”的学生。我需要他们在所有课程中都有“NA”,而不仅仅是 1 或 2 门课程。
我的数据:
| 姓名 | 课程 | 年级 |
|---|---|---|
| 学生1 | en101 | 不适用 |
| 学生1 | 马101 | 乙 |
| 学生1 | py102 | 一种 |
| 学生2 | en101 | 不适用 |
| 学生2 | 马205 | 不适用 |
| 学生2 | en206 | 不适用 |
| 学生3 | 马101 | 不适用 |
我正在尝试为学生提取所有行,前提是他们在所有课程中的成绩都为“NA”。
结果应该是:
| 姓名 | 课程 | 年级 |
|---|---|---|
| 学生2 | en101 | 不适用 |
| 学生2 | 马205 | 不适用 |
| 学生2 | en206 | 不适用 |
| 学生3 | 马101 | 不适用 |
即使其他行不满足条件,我的代码也会提取等级为“NA”的每一行。我需要为该记录拉出所有行,只有当它满足每一行的条件时。
在我看来似乎很容易……似乎无法让它发挥作用。谢谢
一个 Item 有许多 ItemDetails。ItemDetail 具有“type”、“value”和“item_id”字段。
当且仅当项目具有受某些可变条件限制的确切ItemDetails 时,我才需要找到所有项目。例如,我需要查找 ItemDetails 为 (type=10, value=1000) 和 (type=20 and value=2000) 的所有项目
我的第一个解决方案是这样的:
select p.*
from item p
where not exists
(
select c.id from item_detail c
where c.item_id=p.id
and (c.type<>10 or c.value<>1000)
and (c.type<>20 or c.value<>2000)
);
-- Execution Time: 17.819 ms
Run Code Online (Sandbox Code Playgroud)
但我意识到它只获取一个 ItemDetail(type=10, value=1000) 的项目。然后我发现了这个问题并改变了如下查询。
select p.*
from item p
where not exists
(
select c.id from item_detail c
where c.item_id=p.id
and (c.type<>10 or c.value<>1000)
and (c.type<>20 or c.value<>2000) …Run Code Online (Sandbox Code Playgroud) 这些是我创建的表并相应地插入了值:
CREATE TABLE Customer
(Customer_No INTEGER IDENTITY (1,1) PRIMARY KEY,
Customer_Name VARCHAR(30) NOT NULL
)
CREATE TABLE DVD
(DVD_No INTEGER IDENTITY (1,1) PRIMARY KEY,
DVD_Name VARCHAR(30)
)
CREATE TABLE DVD_Purchase
(DVD_Purchase_No INTEGER IDENTITY (1,1) PRIMARY KEY,
DVD_No INTEGER NOT NULL,
Customer_No INTEGER NOT NULL
)
INSERT INTO Customer (Customer_Name)
VALUES('Daman')
INSERT INTO Customer (Customer_Name)
VALUES('Saif')
INSERT INTO Customer (Customer_Name)
VALUES('Gurung')
INSERT INTO Customer (Customer_Name)
VALUES('Upendra')
INSERT INTO DVD (DVD_Name)
VALUES('Bleach')
INSERT INTO DVD (DVD_Name)
VALUES('Gintama')
INSERT INTO DVD (DVD_Name)
VALUES('Tokyo …Run Code Online (Sandbox Code Playgroud) 我的数据库(Postgresql 10)具有以下架构:
CREATE TABLE "PulledTexts" (
"Id" serial PRIMARY KEY,
"BaseText" TEXT,
"CleanText" TEXT
);
CREATE TABLE "UniqueWords" (
"Id" serial PRIMARY KEY,
"WordText" TEXT
);
CREATE TABLE "WordTexts" (
"Id" serial PRIMARY KEY,
"TextIdId" INTEGER REFERENCES "PulledTexts",
"WordIdId" INTEGER REFERENCES "UniqueWords"
);
CREATE INDEX "IX_WordTexts_TextIdId" ON "WordTexts" ("TextIdId");
CREATE INDEX "IX_WordTexts_WordIdId" ON "WordTexts" ("WordIdId");
Run Code Online (Sandbox Code Playgroud)
一些示例数据:
INSERT INTO public."PulledTexts" ("Id", "BaseText", "CleanText") VALUES
(1, 'automate business audit', null),
(2, 'audit trial', null),
(3, 'trial', null),
(4, 'audit', null),
(5, 'fresh …Run Code Online (Sandbox Code Playgroud) postgresql performance subquery relational-division postgresql-performance
鉴于此数据:
gid | val
1 | a
1 | a
1 | a
2 | b
3 | x
3 | y
3 | z
Run Code Online (Sandbox Code Playgroud)
以下查询返回包含一个不同值 (val) 的组 (gid):
SELECT gid FROM t GROUP BY gid HAVING MIN(val) = MAX(val)
SELECT gid FROM t GROUP BY gid HAVING COUNT(DISTINCT val) = 1
Run Code Online (Sandbox Code Playgroud)
人们似乎认为第一个变体会更快(如果假设存在适当的索引,那么查找 MIN 和 MAX 将比计算所有值更快)。这是事实还是神话。
performance sql-server relational-division query-performance
想象一下三个表的设置,User、Group 和 UserGroup,其中 UserGroup 由指向每个 User 和 Group 表的简单外键组成。
User
----
id
name
Group
-----
id
name
UserGroup
---------
user_id
group_id
Run Code Online (Sandbox Code Playgroud)
现在,我想编写一个查询,选择所有指定组中的所有用户。例如,从用户是“group1”、“group2”和“group3”中的每一个的一部分的用户中选择*。
使用 Django ORM 查询,我会做类似的事情
users = (
User.objects
.filter(user_group__group_id=group1.id)
.filter(user_group__group_id=group2.id)
.filter(user_group__group_id=group2.id)
)
Run Code Online (Sandbox Code Playgroud)
这将为每次调用产生一个连接.filter,例如
SELECT * FROM users
INNER JOIN user_group g1 ON g1.user_id = id
INNER JOIN user_group g2 ON g2.user_id = id
INNER JOIN user_group g3 ON g3.user_id = id
WHERE g1.group_id = %s
AND g2.group_id = %s
AND g3.group_id = %s
Run Code Online (Sandbox Code Playgroud)
如果我要查询一个更大的集合来匹配,这会变得有点麻烦。
那么有什么更好的方法来做到这一点呢?如果我要问“任何”而不是“所有”,如果是一个简单的问题
SELECT …Run Code Online (Sandbox Code Playgroud) 我有两个表,外键来自 T1->T2,处于一对多关系。也就是说,表 T1 中的 1 个元组与 T2 中的 0..N 个元组相关联。
为了创建一个简单的例子,假设 T1 是汽车,而 T2 是一个缺陷表。因此,一辆汽车可以有 0..N 个缺陷,我们将这些缺陷作为整数存储在 T2 中。
我想仅从包含缺陷 i1和i2 的汽车中的那些汽车中选择 * 。
相反,执行 OR 非常简单:
SELECT * FROM cars AS T1
WHERE EXISTS (
SELECT imperfection FROM Imperfections as T2
WHERE T1.uid = T2.uid AND (imperfection = 1 OR imperfection = 2)
);
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用交集设置逻辑,但在这一点上,我想知道我是否过于复杂了。
如果有人可以帮助我进行下面的查询,那就太好了!这个查询很有挑战性,我尝试自己做,但无法显示正确的结果......
我使用类似于“Facebook”的系统的数据库。
查询应显示去年为每个帖子发表评论的用户的电子邮件和姓名,这些帖子由他们的每个朋友发布。
意思是,我只想显示对所有朋友的所有帖子发表评论的人。
这是我的试验,但我收到了部分结果。我无法理解我做错了什么。
select distinct U.Mail, U.FirstName + ' ' + U.LastName as FullName
from Users U
inner join FriendsList FL on U.Mail = FL.Mail1
inner join Post P on FL.Mail2 = P.UserMail
left outer join Comment C on P.ID = C.IDPost and P.UserMail <> C.Mail
where datediff(year, P.DatePosted, getdate()) <= 1
group by U.Mail, U.FirstName, U.LastName
having count(distinct P.ID) = count(distinct C.IDPost)
Run Code Online (Sandbox Code Playgroud)
BAK文件链接(包括测试数据):https : //file.io/SagvM3cx
例子:
让我们假设 I & Adam & Ben 是朋友。
?? 第一种情况: …