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

SQL Query help using UNION or nested queries

我正在尝试执行查询,但对我来说效果不是很好。我得到了这些 tables:

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;

我想要做的是匹配 table "spelare" 中的 'Spnr' 列与 table "speltillfalle" 中的 Spnr 列。我使用这个查询做到了:

SELECT Spnr FROM spelare UNION SELECT Spnr FROM speltillfalle;

这给了我在两个 table 中匹配的所有 Spnr 值。我想做的是同样的事情并添加另一个条件。 IT 应该 return 同样的事情,但前提是 table "speltillfalle" 中的 "resultat" 列的值对于相应的匹配 Spnr 是 'Diskad'。

像这样使用Exists

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

根据您的描述,您只需将其添加为 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'
 );

或输入:

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

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

我想你想要 join:

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

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

"select a.spnr,b.spnr from spelare a,speltillfalle b where a.spnr=b.spnr and b.resultat='Diskad'"

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

因为您已经对这两个 table 和它 returns 列 Spnr 的所有匹配记录应用了连接,我们只需要再添加一个条件,如上所示,以便仅影响那些记录 whoes值为 'Diskad'.

当您询问 "the Spnr values that matched in both tables" 和 "the match 'Spnr' column from the table spelare with the Spnr column from the table speltillfalle" 时,您不需要 UNION。 在我的书中 "matched" 表示它们同时出现在 table 中。

speltillfalle 上的 Spnr 列定义为

foreign key (Spnr) references spelare(Spnr)

因此,如果 speltillfalle.Spnr 不为空(可能是因为您没有添加任何 NOT NULL 约束)肯定存在于 spelaretable。 在这种情况下

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

是否有效:您从 speltillfalle 获得的 Spnr 值肯定存在于 spelare table,因为外键约束。