标签: relational-division

查找具有相同子行集的父行

假设我有这样的结构:

食谱表

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

9
推荐指数
2
解决办法
3861
查看次数

在关系除法中删除重复的 SELECT 语句

我有一个执行大量重复工作的查询:

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)

relational-division redshift

7
推荐指数
1
解决办法
351
查看次数

仅当满足所有记录的条件时选择所有记录

抱歉,如果之前已经问过这个问题。我找不到任何例子。

我试图将学生的课程作业拉出一个学期,前提是他们在所有课程中都获得了“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”的每一行。我需要为该记录拉出所有行,只有当它满足每一行的条件时。

在我看来似乎很容易……似乎无法让它发挥作用。谢谢

sql-server sql-server-2012 relational-division

6
推荐指数
2
解决办法
824
查看次数

SQL查询以查找子记录是特定集合的所有父记录

一个 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)

postgresql relational-division

5
推荐指数
1
解决办法
7910
查看次数

SQL 查询以显示已购买所有 DVD 的客户的姓名

这些是我创建的表并相应地插入了值:

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)

sql-server relational-division

5
推荐指数
1
解决办法
4万
查看次数

编写此查询的更好方法是什么?

我的数据库(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

5
推荐指数
1
解决办法
211
查看次数

查找只有一个值的组:COUNT(DISTINCT x) = 1 vs MIN(x) = MAX(x)

鉴于此数据:

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

5
推荐指数
1
解决办法
126
查看次数

跨多对多关系查询“全部”

想象一下三个表的设置,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)

postgresql relational-division many-to-many

5
推荐指数
1
解决办法
5014
查看次数

单个查询中的多对一子选择

我有两个表,外键来自 T1->T2,处于一对多关系。也就是说,表 T1 中的 1 个元组与 T2 中的 0..N 个元组相关联。

为了创建一个简单的例子,假设 T1 是汽车,而 T2 是一个缺陷表。因此,一辆汽车可以有 0..N 个缺陷,我们将这些缺陷作为整数存储在 T2 中。

我想仅从包含缺陷 i1i2 的汽车中的那些汽车中选择 * 。

相反,执行 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)

我一直在尝试使用交集设置逻辑,但在这一点上,我想知道我是否过于复杂了。

postgresql database-design relational-division

4
推荐指数
2
解决办法
2万
查看次数

使用 4 个表的 JOIN 查询的结果不正确

如果有人可以帮助我进行下面的查询,那就太好了!这个查询很有挑战性,我尝试自己做,但无法显示正确的结果......

我使用类似于“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 是朋友。

?? 第一种情况: …

sql-server relational-division

4
推荐指数
1
解决办法
52
查看次数