CROSS JOIN和之间有什么区别INNER JOIN?
交叉加入:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status],
FROM
Customers
CROSS JOIN
Movies
Run Code Online (Sandbox Code Playgroud)
内部联接:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status]
FROM
Customers
INNER JOIN
Movies ON Customers.CustomerID = Movies.CustomerID
Run Code Online (Sandbox Code Playgroud)
哪一个更好,为什么我会使用其中一个?
我试图运行使用EXIST子句的查询:
select <...>
from A, B, C
where
A.FK_1 = B.PK and
A.FK_2 = C.PK and
exists (select A.ID from <subquery 1>) or
exists (select A.ID from <subquery 2>)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不受支持.我也尝试用EXISTS一个IN子句替换该子句:
select <...>
from A, B, C
where
A.FK_1 = B.PK and
A.FK_2 = C.PK and
A.ID in (select ID from ...) or
A.ID in (select ID from ...)
Run Code Online (Sandbox Code Playgroud)
不幸的是,该IN条款似乎也没有得到支持.
有关如何编写实现所需结果的SQL查询的任何想法?我原则上可以将该WHERE条款建模为另一个条款,JOIN而第二个OR条款则可以模拟,UNION但它看起来非常笨拙.
编辑:列出一些可能的解决方案.
解决方案1
select <...>
from A, …Run Code Online (Sandbox Code Playgroud) 想象一下,我有两个简单的表,例如:
CREATE TABLE departments(dept INT PRIMARY KEY, name);
CREATE TABLE employees(id PRIMARY KEY, fname, gname,
dept INT REFERENCES departments(dept));
Run Code Online (Sandbox Code Playgroud)
(当然简化).
我可以有以下任何陈述:
SELECT * FROM employees e INNER JOIN departments d ON e.dept=d.dept;
SELECT * FROM employees e NATURAL JOIN departments d;
SELECT * FROM employees e JOIN departments d USING(dept);
Run Code Online (Sandbox Code Playgroud)
可以在这里找到一个工作示例:SQL Fiddle:http://sqlfiddle.com/#!15/864a5/13/10
它们都给出了几乎相同的结果 - 当然是相同的行.
我一直更喜欢第一种形式,因为它具有灵活性,可读性和可预测性 - 你清楚地定义了什么与什么有关.
现在,除了第一种形式有重复的列之外,其他两种形式是否真的有优势?或者他们只是语法糖?
我可以看到后一种形式的缺点是你应该命名你的主键和外键相同,这并不总是实用的.
我正在尝试为我的项目管理软件绘制一个ER图,描述以下内容。它包含以下实体:
和:
一个项目可以分为任务。(任务可以由管理员用户创建,管理员用户可以将这些任务分配给选定的项目。这里仅将任务分配给项目,而没有将员工分配给项目。)
可以将员工分配到项目。
(可以将员工分配到项目。这里仅将员工分配到项目,而没有分配到项目任务。)
对于选定项目的选定任务,我们可以从资源池中分配员工-在2中分配给该项目的员工。(这一次,我们必须指定项目,任务和员工;所有3个选择都是必需的。)
上面1、2和3的输入过程可以在系统的单独页面中完成。您可以先选择其中的任何一个。
对于以上关系,我创建了此ERD:
考虑
是否需要两个单独的关系(如ER图中的关系,关系1和关系2)?
要么
我们还可以仅使用项目,员工和任务之间的关系3,而不使用关系3吗?
database database-design entity-relationship relational-database database-schema
我处于无处可去的情况。我不知道如何解决关系代数问题。
Deposit (Branch, Acc-No, Cust-Name, Balance)
Loan (Branch, Loan-No, Cust-Name, Balance)
Branch (Branch, Assets, Branch-County)
Customer (Cust-Name, Cust-County, Branch)
Run Code Online (Sandbox Code Playgroud)
产生一个关系,该关系显示所有贷款大于2500.00英镑的客户和所有存款账户小于100英镑的客户的分支机构,客户名称,余额和帐号。所有客户都应在Romford分公司。
到目前为止,这是我想出的。这是对的吗?
? Branch, Acc-No, Cust-Name, Balance (
?(Loan.Balance > 2000 ? branch='Romford')(Loan)
? ?(Deposit.Balance < 150 ? branch='Romford')(Customer ? Deposit)
)
Run Code Online (Sandbox Code Playgroud)
正确的答案是:
? Branch, Cust-Name, Balance, Acc-No,
(? Balance < 100^branch=”Romford” (Deposit))
?
? Branch, Cust-Name, Balance, Loan-No,
(? Balance > 2500 ^branch=”Romford”(Loan))
Run Code Online (Sandbox Code Playgroud) 我有几个具有多对多关系的表。\n例如表视频架构
\n\nCREATE TABLE `videos` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `description` varchar(10000) DEFAULT NULL,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=47606 DEFAULT CHARSET=utf8;\nRun Code Online (Sandbox Code Playgroud)\n\n和两个表 actor film_actors,例如 writers 和 film_writers
\n\n演员和电影演员模式
\n\nCREATE TABLE `actors` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `name` varchar(255) DEFAULT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `actors_UN` (`name`)\n) ENGINE=InnoDB AUTO_INCREMENT=152216 DEFAULT CHARSET=utf8;\n\n\nCREATE TABLE `film_actors` (\n `actor_id` int(11) NOT NULL,\n `film_id` int(11) NOT NULL,\n PRIMARY KEY (`film_id`,`actor_id`),\n KEY `FKrs472oyyff3hfwq10pyo94k1d` (`actor_id`),\n CONSTRAINT `FK12uvap3je50qd8cq3s0jf7h7r` FOREIGN KEY (`film_id`) REFERENCES `videos` …Run Code Online (Sandbox Code Playgroud) 我有两张桌子:orders和customer
orders:
+--------+-----------+------------+-------------+-------------+
| ord_no | purch_amt | ord_date | customer_id | salesman_id |
+--------+-----------+------------+-------------+-------------+
| 70009 | 270.65 | 2012-09-10 | 3001 | 5005 |
| 70002 | 65.26 | 2012-10-05 | 3002 | 5001 |
| 70004 | 110.50 | 2012-08-17 | 3009 | 5003 |
| 70005 | 2400.60 | 2012-07-27 | 3007 | 5001 |
| 70008 | 5760.00 | 2012-09-10 | 3002 | 5001 |
| 70010 | 1983.43 | 2012-10-10 …Run Code Online (Sandbox Code Playgroud) 我在 MS Access 中有两个表,用于跟踪班级辅导员和他们辅导的班级。这两个表的结构如下:
tbl_促进者
facilID -> a unique autonumber to keep track of individual teachers
facilLname -> the Last name of the facilitator
facilFname -> the First name of the facilitator
Run Code Online (Sandbox Code Playgroud)
tbl_facilitatorClasses
classID -> a unique autonumber to keep track of individual classes
className -> the name of the class (science, math, etc)
primeFacil -> the facilID from the first table of a teacher who is primary facilitator
secondFacil -> the facilID from the first table of another teacher …Run Code Online (Sandbox Code Playgroud) 我正在使用 2 个表:1 个表处理一组人的基本人口统计数据,1 个表处理已完成的活动。我需要做的是从人口统计表中提取所有结果(所有人),然后显示在给定时间范围内完成某种类型活动的任何人的活动信息(给定的人也可能完成了多项活动)在那个时间范围内)。如果某人尚未完成任何指定的活动,我仍然希望他们在列表中可见。我希望结果如下所示:
PersonID Name DateOfBirth ActivityDate ActivityType
---------------------------------------------------------------------
1001 John Smith 01/01/1990 10/18/2022 Painting
1002 Jane Doe 12/31/1980 NULL NULL
1003 Bob Brown 07/04/1995 10/17/2022 Reading
1003 Bob Brown 07/04/1995 09/09/2022 Painting
1004 Mike Jones 03/24/1984 NULL NULL
1005 Ann Green 11/30/1988 08/29/2022 Writing
1006 Sally Black 05/15/1999 NULL NULL
Run Code Online (Sandbox Code Playgroud)
看起来这应该是LEFT JOIN两个表之间非常简单的查询:
SELECT DISTINCT
d.PersonID,
d.Name
d.DateOfBirth,
a.ActivityDate
a.ActivityType
FROM Demographics d
LEFT JOIN Activity a ON d.PersonID = a.PersonID
WHERE ActivityDate BETWEEN DATEADD(yy,-1,GETDATE()) AND …Run Code Online (Sandbox Code Playgroud) sql ×7
join ×4
sql-server ×3
cross-join ×1
database ×1
inner-join ×1
left-join ×1
ms-access ×1
mysql ×1
self-join ×1
t-sql ×1
union ×1