2015-11-04 93 views
2

我正在尝试在两个子查询中查找具有相同ID的所有条目并显示第一个表。我遇到了使用别名的问题。SQL多个子查询

(SELECT * 
FROM personTable 
WHERE ID IN 
    ( SELECT ID 
      FROM workerTable 
    ) 
AND firstName LIKE 'O%'); 


(SELECT * 
    FROM ownsTable 
    WHERE PhoneNumberID IN 
     (SELECT ID 
     FROM phonenumberTable 
     WHERE Home <>'' AND `Work` <>'' AND Cell <>'' 
    ) 
); 

我想现在检查的第一个表的“ID”对第二个表的“是PersonID”,返回的行中第一个表,其中ID和匹配是PersonID。

+1

参见[加入这个伟大的解释(http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/) –

+0

请显示您的表格模式,表格中的一些示例数据以及对所需最终结果的清晰说明,以便您可以获得有关如何利用连接来执行所需操作的更好建议。 –

回答

0

使用Exists做到这一点

SELECT * 
FROM persontable p 
WHERE id IN (SELECT id 
       FROM workertable) 
     AND firstname LIKE 'O%' 
     AND EXISTS (SELECT 1 
        FROM ownstable o 
        WHERE phonenumberid IN (SELECT id 
              FROM phonenumbertable 
              WHERE home <> '' 
                AND ` work ` <> '' 
                AND cell <> '') 
          AND p.id = o.personid); 

此外,如果可能的IN转换为Exists所有sub-queries可能是有点高效

+0

谢谢这就是我正在寻找的。我一直试图使用'AS',但我的语法不正确,所以AND p.id = o.personid);效果很好。 –

0

这听起来像你可以做一个简单的加入了这一点:

SELECT p.* 
FROM personTable p 
JOIN ownsTable o ON o.id = p.id AND p.firstName LIKE 'O%' AND o.home <> '' AND o.work <> '' AND o.cell <> ''; 

这将选择第一个表中的所有列,只要第二个表中存在该id,匹配的行满足给定的要求。

0

这应该为你做:)

SELECT * FROM 
    (SELECT * FROM personTable 
    WHERE ID IN (SELECT ID FROM workerTable) 
     AND firstName LIKE 'O%')T1 
    JOIN 
    (SELECT * FROM ownsTable 
    WHERE PhoneNumberID IN 
     (SELECT ID FROM phonenumberTable WHERE Home <>'' AND `Work` <>'' AND Cell <>'')) T2 
    ON (T1.ID = T2.PersonId);