使用SQL子查询选择All

时间:2016-08-19 07:02:23

标签: sql sql-server join subquery

我有两张这样的表

#remember original values
source_old = df.source.copy()

df.source = (df.source.diff() != 0).cumsum() - 1

#series for maping
ser = pd.Series(df.source.values, index=source_old).drop_duplicates()
print (ser)
source
1      0
579    1
745    2
834    3
dtype: int32

#map where values exists
df.target = df.target.mask(df.target.isin(ser), df.target.map(ser)).astype(int)

print (df)
   source  target    weight
0       0   70399  0.988375
1       0   33919  0.981573
2       0   62461  0.981427
3       1       0  0.983019
4       2       0  0.995580
5       3       0  0.980943

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

var series = require('stream-series');

gulp.task('fincss', function () {
    watch([workData.sassSrcFiles, workData.cssVendorSrcFiles], {}, function () {
        var convertFromScssToCssAndConcat =
            gulp.src(workData.sassSrcFiles)
                .pipe(plumber({errorHandler: function(error) {
                     convertFromScssToCssAndConcat.emit('end')  // important
                 }}))
                .pipe(sass());

        var minifyAndConcatExistingCss =
            gulp.src(workData.cssVendorSrcFiles)
                .pipe(plumber(error));

        return series(minifyAndConcatExistingCss, convertFromScssToCssAndConcat)
            .pipe(concat('final.min.css'))
            .pipe(uglifycss())
            .pipe(gulp.dest(workData.cssDest))
            .pipe(livereload());
    });

以下是我的尝试。

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

这会产生以下错误。

  

当选择列表中只能指定一个表达式时   子查询不是用EXISTS引入的。

5 个答案:

答案 0 :(得分: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'

答案 1 :(得分:1)

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

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

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

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

以下记录在部门

Dno Name          
1  Advertisement 
2  Programming   
3  Analysement

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您不能在子查询中放置两列

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

答案 4 :(得分:0)

更好地使用' EXISTS'而不是' IN'条款。这是脚本

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