【问题标题】:Select All using SQL subquery使用 SQL 子查询全选
【发布时间】:2016-08-19 07:02:22
【问题描述】:

我有两张这样的桌子

create table department(
Dno int primary key,
name varchar(50) not null
)


create table employee(
empid int primary key,
name varchar(50) not null,
sal decimal(7,2) not null,
dno int foreign key references department(Dno))

我想使用 SQL 子查询获得以下查询的相同结果。

SELECT e.Name, e.Sal, d.Dno, d.Name
FROM Employee e,
     Department d
WHERE e.Dno = d.Dno
  AND e.name = 'aa'

以下是我尝试过的。

SELECT Name, Sal
FROM Employee
WHERE Name= 'aa' AND Dno IN
    (SELECT Dno, name
     FROM Department) 

这会产生以下错误。

选择列表中只能指定一个表达式,当 EXISTS 没有引入子查询。

【问题讨论】:

  • 只需在子查询中执行select dno from department,您不需要选择name
  • @msanz 如果我想使用子查询显示所有两个表,我该怎么做?
  • 在下面查看我的答案
  • 你为什么不直接使用 join ?
  • 附带说明:您当然应该避免使用Old Style JOINS,并使用明确的INNER JOINs

标签: sql sql-server join subquery


【解决方案1】:

您的子查询应该只选择一个列并返回一个列表。

SELECT Name, Sal
FROM Employee
WHERE Name= 'aa' AND Dno IN
    (SELECT Dno FROM Department)

另一方面,您不能通过子查询将Department 中的列放入结果中。

实现您想要获得的最佳方式是加入表格:

SELECT e.Name, e.Sal, d.Dno, d.Name
FROM Employee e 
INNER JOIN Department d ON e.Dno = d.Dno
WHERE e.name = 'aa'

【讨论】:

  • 如果我想使用子查询显示所有两个表,我该怎么做?
  • @NilaniAlgiriyage 你不能。子查询不适用于此目的。你需要做你目前正在做的事情,或者只是JOIN两个表
  • 非常感谢
【解决方案2】:
SELECT Name, Sal
FROM Employee
WHERE Name= 'aa' AND Dno IN
    (SELECT Dno
      FROM Department) 

您需要删除子查询中的名称。执行查询时,请考虑将子查询接收到的每个值与“主”查询的值进行比较。

如果您在员工中有以下记录

ID   Name   Sal   Dno
1    Bob    3000     3
2    Alice  3000     2

以及下面的部门记录

Dno Name          
1  Advertisement 
2  Programming   
3  Analysement

您当然不能将 Bob 的值 3 与 {3, Analysement} 进行比较。子查询通常用于过滤行,而不是像连接一样显示额外的值。

【讨论】:

    【解决方案3】:

    子查询可用于从多个相关表中获取数据。 它不能用于连接两个表。 如果要显示多个表,则必须使用 JOIN 或 UNION。

    【讨论】:

      【解决方案4】:

      你不能在子查询中放两列

      SELECT Name, Sal
      FROM Employee
      WHERE Name= 'aa' AND Dno IN
          (SELECT Dno
            FROM Department) 
      

      【讨论】:

      • 如果我想使用子查询显示所有两个表,我该怎么做?
      【解决方案5】:

      最好使用“EXISTS”而不是“IN”子句。这是脚本

      SELECT Name, Sal
      FROM Employee e
      WHERE Name= 'aa' 
         AND EXISTS (SELECT 1 FROM Department d WHERE e.Dno=d.Dno) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-27
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多