Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将嵌套选择表示为更简单的联接_Sql_Join - Fatal编程技术网

Sql 如何将嵌套选择表示为更简单的联接

Sql 如何将嵌套选择表示为更简单的联接,sql,join,Sql,Join,我有三张桌子: customers: id, name transactions: id_customer, id_item items: id, name 我想编写一个简单的查询,返回订购了名为“apple”的商品的所有客户的姓名 我知道我可以做一些事情,比如: SELECT name FROM customers WHERE id IN (SELECT id_customer

我有三张桌子:

customers:    id,          name
transactions: id_customer, id_item
items:        id,          name
我想编写一个简单的查询,返回订购了名为“apple”的商品的所有客户的姓名

我知道我可以做一些事情,比如:

SELECT
  name
FROM
  customers
WHERE id IN (SELECT
               id_customer
             FROM
               transactions
             WHERE id_item IN (SELECT
                                 id
                               FROM
                                 items
                               WHERE name = 'apple'))

这可能不太糟糕,但似乎很复杂,可能有一种更直接的方法可以使用联接来实现这一点?

是的,在这种情况下使用联接肯定更好。试试这个:

SELECT DISTINCT
    A.name
FROM 
    customers A INNER JOIN
    transactions B ON A.id = B.id_customer INNER JOIN
    items C ON B.id_item = C.id
WHERE C.name = 'apple'

这样,只有下了包含“苹果”的订单的客户才会显示。

使用Join case,这是最好的方法

Select C.name from Customers C 
Inner Join Transaction T on C.id = T.id_customer 
Inner Join Items I on T.id_items = I.id
where I.name = "Apple"

上述查询将返回订购“苹果”的所有客户的姓名

您需要
不同的
。正确。谢谢,太好了。这两个查询之间有性能差异吗?我想你的方式更快,但我不知道为什么。特别是如果表之间的关系是用外键显式声明的。这样,DBMS将只检查匹配的键,而不是先扫描整个表以满足嵌套的
SELECT
s。首先计算哪个内部联接?谢谢。我认为,正如吉吉桑的回答一样,应该有一个明确的答案