SQL查询帮助使用UNION或嵌套查询

时间:2015-05-25 10:52:33

标签: mysql sql union

我正在尝试执行一个查询,但它对我来说效果不佳。我得到了这些表格:

create table spelare(
   Spnr char(13),
   Snamn varchar (20),
   primary key (Spnr)
)engine=innodb;


create table speltillfalle(
   starttid varchar (15),
   Tnamn varchar (20),
   Spnr char (13),
   resultat char (10),
   primary key (starttid, Tnamn, Spnr),
   foreign key (Tnamn) references tavling(Tnamn),
   foreign key (Spnr) references spelare(Spnr)
)engine=innodb;

我想要做的就是比赛' Spnr'表中的列" spelare"使用表格中的Spnr列" speltillfalle"。我使用这个查询做到了:

SELECT Spnr FROM spelare UNION SELECT Spnr FROM speltillfalle;

这给了我两个表中匹配的所有Spnr值。我想做的是同样的事情,并添加另一个条件。 IT应返回相同的内容,但仅限于" resultat"表格中的列" speltillfalle"是' Diskad'对应匹配的Spnr。

6 个答案:

答案 0 :(得分:5)

根据您的描述,您只需将其添加为WHERE条件:

SELECT Spnr FROM spelare 
UNION 
SELECT Spnr FROM speltillfalle
WHERE resultat = 'Diskad';

或者您使用EXISTS:

SELECT Spnr FROM spelare AS s
WHERE EXISTS
 ( 
   SELECT * FROM speltillfalle AS sf
   WHERE s.Spnr = sf.Spnr
     AND resultat = 'Diskad'
 );

或IN:

SELECT Spnr FROM spelare AS s
WHERE Spnr IN
 ( 
   SELECT Spnr FROM speltillfalle AS sf
   WHERE resultat = 'Diskad'
 );

INEXSISTS都是比UNION更常见的解决方案: - )

答案 1 :(得分:2)

像这样使用Exists

SELECT Spnr, Snamn 
FROM spelare 
WHERE EXISTS 
(
SELECT 1
FROM speltillfalle
WHERE resultat = 'Diskad'
AND Spnr = spelare.Spnr
);

答案 2 :(得分:0)

我想你想要join

select sp.Spnr from spelare sp
join speltillfalle sf on sp.Spnr = sf.Spnr and sf.resultat = 'Diskad'
group by sp.Spnr 

答案 3 :(得分:0)

如果我理解你的问题,那么答案可能是

“从spelare a,speltillfalle b中选择a.spnr,b.spnr,其中a.spnr = b.spnr和b.resultat ='Diskad'”

答案 4 :(得分:0)

SELECT s.Spnr 
  FROM spelare as s 
 INNER 
  JOIN speltillfalle as sf 
    on s.Spnr=sf.Spnr 
 where sf.Spnr = 'Diskad';

由于您已在这两个表上应用了一个连接,并且它返回了列Spnr的所有匹配记录,我们只需要再添加一个条件,如上所示,仅为那些记录值为' Diskad'

答案 5 :(得分:0)

当你在表格 speltillfalle spelare 中的“Spnr值”和“em> spelare 中的匹配'Spnr'列时>“你不需要UNION。 在我的书中,“匹配”意味着它们出现在两个表格中。

speltillfalle 上的Spnr列定义为

foreign key (Spnr) references spelare(Spnr)

因此,如果 speltillfalle.Spnr 不为null(可能是因为您没有添加任何NOT NULL约束), spelare 表中确实存在。 在这种情况下

SELECT DISTINCT Spnr FROM speltillfalle WHERE resultat = 'Diskad' AND Spnr IS NOT NULL

完成工作:由于外键约束,您从 speltillfalle 获得的Spnr值确实存在于 spelare 表中。