2010-06-25 85 views
2

如何针对以下情况执行SQL查询?假设您有两个表:table1和table2,其中table1中的每个条目可以在table2中有多个相应的条目。为此,我想查询的伪代码为:SQL查询加入问题

for each $row in table1 
    $rows = find all rows in table2 that corresponds to $row with $row.id == table2.foreign_id 
    # $rows is an array of corresponding row in table2 
    if all rows in $rows meet some condition 
    then 
    return $row 
    else 
    continue 
    end 
end 

编辑:音符在上面的伪代码,我只希望有它的所有关系,在符合某些条件下,不只是一些条件TABLE2在表1的行在table1中。

PS:我想在SQL中这样做,因为效率问题,否则我可能会遇到问题。

非常感谢。

+0

非常感谢您的信息。这个网站仍然是新的。 :) – fzhou 2010-06-25 18:28:13

回答

6

您可以使用where not exists (..)类型子句对此进行重新表达。

例如,假装你想要的客户,其订单都完成的列表:

select * from customers c 
where not exists (
    select * from orders 
    where customerid=c.id 
     and status <> 'C' 
) 

所以你所要求的谁没有未完成订单的所有客户 - 这是同样的事情,所有的客户,其订单全部完成。

相反的:

if all rows in $rows meet some condition 

你是在说:

if NO rows in $rows DO NOT meet some condition 

编辑:正如在评论中指出,这也将返回谁没有任何订单的客户。您可以在上面添加and exists (select * from orders where customerid=c.id)以排除这些行。

+0

非常感谢。这是我想要的实际查询。我想''中的所有行都是棘手的。 – fzhou 2010-06-25 15:50:31

+1

这不会也没有订单返回所有客户? – cjk 2010-06-25 15:55:53

+0

@ck true;不确定这是否会成为问题。 – Blorgbeard 2010-06-25 15:58:57

4
select * from table1 as t1 
inner join table2 as t2 
    on t1.id == t2.foreign_id 
where -- some condition goes here 

此查询将仅返回table1中匹配table2且匹配where子句的行。

我建议检出SQLCourse - Interactive Online SQL Training for Beginners,因为这实际上是一个基本的SQL查询。

-2

一般格式为:

SELECT * 
FROM Table1 t1 
    INNER JOIN Table2 t2 ON (t1.ID = t2.ID) 
WHERE ... 
0

我觉得这是你做了什么,在...嵌套查询是派生表名为sub_query和相当于你这部分伪代码($行=找到table2中的所有行对应于具有$ row.id == table2.foreign_id的$ row)。外部选择让你进一步过滤你的伪代码的第一部分的一些条件(你的if语句)

select 
     sub_query.* 
    from 
     (select 
      * 
     from 
      table1, 
      table2 
     where 
      table1.id = table2.foreign_key_id) sub_query 
    where 
     sub_query.some_field = "some condition" 

享受!

0

正如ck提到的,这真的是基本的sql。

每个$行table1中

SELECT table1.* FROM table1 

发现在表2中的所有行对应于$以$ row.id ==表2排。foreign_id

LEFT JOIN table2 ON table1.id = table2.foreign_id 

如果$行中的所有行符合一定条件

WHERE condition_here 

整个SQL变得

SELECT 
    table1.* 
FROM table1 
    LEFT JOIN table2 ON table1.id = table2.foreign_id 
WHERE condition_here 
+0

是的,让我们在提问之前先将提及它的所有答案都记下来。 – simendsjo 2010-06-25 15:38:33

0

这里是一个可能的解决方案。我使用Oracle,不确定MySQL的语法是否完全正确,但我想你可以处理一个等价的东西。

这样做的想法是找到table2中所有行满足所需条件的所有id,然后在table1中查找这些id。

SELECT * 
    FROM table1 
    WHERE id IN (
    SELECT id 
     FROM table2 
     GROUP BY id 
     HAVING COUNT(*) = SUM(CASE WHEN <somecondition> THEN 1 ELSE 0 END) 
)