相关疑难解决方法(0)

SQL Server 2008中的CROSS JOIN与INNER JOIN

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)

哪一个更好,为什么我会使用其中一个?

sql t-sql sql-server cross-join sql-server-2008

133
推荐指数
7
解决办法
35万
查看次数

Spark替换EXISTS和IN

我试图运行使用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)

sql apache-spark-sql

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

Inner Join vs Natural Join vs USING子句:有什么优势吗?

想象一下,我有两个简单的表,例如:

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

它们都给出了几乎相同的结果 - 当然是相同的行.

我一直更喜欢第一种形式,因为它具有灵活性,可读性和可预测性 - 你清楚地定义了什么与什么有关.

现在,除了第一种形式有重复的列之外,其他两种形式是否真的有优势?或者他们只是语法糖?

我可以看到后一种形式的缺点是你应该命名你的主键和外键相同,这并不总是实用的.

sql join

6
推荐指数
1
解决办法
3650
查看次数

ER图中3个实体之间的关系-是一个三元数还是还需要2个二进制数?

我正在尝试为我的项目管理软件绘制一个ER图,描述以下内容。它包含以下实体:

  • 项目-软件项目
  • 任务-可以分解为许多任务的软件项目
  • 员工-属于此软件的员工

和:

  1. 一个项目可以分为任务。(任务可以由管理员用户创建,管理员用户可以将这些任务分配给选定的项目。这里仅将任务分配给项目,而没有将员工分配给项目。)

  2. 可以将员工分配到项目。
    (可以将员工分配到项目。这里仅将员工分配到项目,而没有分配到项目任务。)

  3. 对于选定项目的选定任务,我们可以从资源池中分配员工-在2中分配给该项目的员工。(这一次,我们必须指定项目,任务和员工;所有3个选择都是必需的。)

上面1、2和3的输入过程可以在系统的单独页面中完成。您可以先选择其中的任何一个。

对于以上关系,我创建了此ERD:

在此处输入图片说明

考虑

  • 项目与任务之间的关系1
  • 项目与员工之间的关系2

是否需要两个单独的关系(如ER图中的关系,关系1和关系2)?

要么

我们还可以仅使用项目,员工和任务之间的关系3,而不使用关系3吗?

database database-design entity-relationship relational-database database-schema

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

银行业务情景的关系代数

我处于无处可去的情况。我不知道如何解决关系代数问题。

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)

relational-algebra

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

多对多连接,无重复行

我有几个具有多对多关系的表。\n例如表视频架构

\n\n
CREATE 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;\n
Run Code Online (Sandbox Code Playgroud)\n\n

和两个表 actor film_actors,例如 writers 和 film_writers

\n\n

演员和电影演员模式

\n\n
CREATE 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)

mysql sql join

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

如何确定加入表的键

我有两张桌子:orderscustomer

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)

sql sql-server join

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

如何从另一个 SQL 表中获取两个不同列的匹配数据:内连接和/或联合?

我在 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)

sql union ms-access inner-join self-join

3
推荐指数
1
解决办法
1140
查看次数

当不存在行时,LEFT JOIN 不返回 null

我正在使用 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 sql-server join left-join

-1
推荐指数
1
解决办法
202
查看次数