我是SQL的新手,我正在尝试学习如何使用IN运算符。
有2个表(客户,国家),但国家/地区名称信息不包含在customers表中。在客户表中只有国家的ID。所以我获得国家名称的方法如下:
SELECT C_ID,C_NAME,N_NAME
FROM customers,nation
WHERE N_NAME in(SELECT N_NAME FROM nation WHERE nation.N_NAME = "GERMANY")
问题在于此查询会返回一个表格,其中包含来自所有国家/地区的所有客户 ,而N_NAME
列中只显示“德国”,即使有很多不同的国籍
所需的结果是包含来自德国的客户的表格。
答案 0 :(得分:3)
您的where子句限制Nation表中的项目,但不限制Customers表。或者,以另一种方式查看,子查询选择正确的行,但之后您已向查询(Customers)添加了一个没有限制的新表。
解决这个问题的正确方法不是使用IN运算符,而是使用JOIN运算符。使用customer表中的nation键将两个表连接在一起。你没有给我们所有的列名,所以我将不得不猜测国家的关键。
SELECT c.C_ID, c.C_NAME, n.N_NAME FROM customers c
INNER JOIN nation n ON n.NATION_ID = c.NATION_ID;
这将为您提供客户及其各自国家的名称。要将其限制为德国,请添加WHERE子句:
SELECT c.C_ID, c.C_NAME, n.N_NAME FROM customers c
INNER JOIN nation n ON n.NATION_ID = c.NATION_ID
WHERE n.NATION_NAME='Germany';
答案 1 :(得分:1)
尝试以下查询
SELECT C_ID,C_NAME,N_NAME
FROM customers
WHERE EXISTS
(
SELECT 1 FROM nation WHERE nation.N_NAME = "GERMANY" AND nation.Nationid
= customers.Nationid
)
答案 2 :(得分:0)
你有没有加入客户和国家表?试试这个问题:
选择C_ID,C_NAME,N_NAME 来自客户 关于customers.C_NAME = nation.N_NAME的INNER JOIN国家/地区 WHERE nation.N_NAME ='德国'
答案 3 :(得分:0)
问题是您正在交叉加入客户和国家/地区表。尝试
SELECT C_ID,C_NAME,N_NAME
FROM customers
INNER JOIN nation
on customers.NationID = nation.NationID
WHERE N_NAME in(SELECT N_NAME FROM nation WHERE nation.N_NAME = "GERMANY")
交叉连接会将一个表中的每条记录连接到另一个表中的每条记录。 INNER JOIN将仅根据定义表连接方式的on子句返回两个表中存在的记录。