0

我对 SQL 很陌生...我有一个包含以下列的表:

Employee,Title,Age,Children

基本 SELECT 的输出将是:

Steve |Foreman|40|Billy
Steve |Foreman|40|Amy
Steve |Foreman|40|Michelle
Daniel|Smith  |35|Eric
Daniel|Smith  |35|Jake
Erin  |Otis   |29|Eileen

希望我已经证明每条记录都可以包含多个子项。我想做的是仅在员工没有名字以“E”开头的孩子的情况下才返回值。现在我仍在返回员工,但它只列出了没有以“E”开头的孩子的记录。如果他们的任何孩子以“E”开头,我想完全省略员工,而不仅仅是省略以“E”开头的孩子。

这可能吗?

谢谢。

编辑 :

所以实际上有两张表,一张用于 EMPLOYEES,一张用于 CHILDREN。所以我当前的查询如下所示:

SELECT E.EMPLOYEE_NAME, E.EMPLOYEE_TITLE, E.EMPLOYEE_AGE, C.CHILDREN_NAME
  FROM EMPLOYEE E INNER JOIN CHILDREN C ON E.EMPLOYEE_ID = C.EMPLOYEE_ID
 WHERE C.CHILDREN_NAME NOT LIKE 'E%'

这将返回所有行减去名称以 E 开头的任何子项。所需的效果是 Trinimon 提供的解决方案 2;如果员工的任何孩子的名字以 E 开头,则不要遣返员工。

我希望这能解释得更多,有人可以解释如何产生预期的结果。如前所述,Trinimon 的解决方案返回正确的结果,但由于有两个表,我不知道如何将解决方案调整到我的模式。

谢谢。

4

3 回答 3

1

你可以试试:

select * from YourTable T
where NOT EXISTS (select 1 from YourTable where Employee=T.Employee and Children like 'E%')

当然,如果您有两个同名的员工,这将有问题。您可以扩展该WHERE子句以涵盖使员工相同的所有属性:

select * from YourTable T
where NOT EXISTS (select 1 from YourTable where Employee=T.Employee and Title=T.Title and Age=T.Age and Children like 'E%')

但是,您应该考虑制作Children一个单独的表格。在您的表中有一个Employee(具有唯一性),并包含每个子项和对 的引用。EmployeeIDChildrenEmployeeID

于 2013-09-26T19:15:27.500 回答
1

要么去...

SELECT * 
  FROM employees
 WHERE Children NOT LIKE 'E%';

如果您想要孩子名字不以或开头的所有记录E...

SELECT * 
  FROM employees e1
 WHERE NOT EXISTS (SELECT 1 
                     FROM employees e2
                    WHERE e1.Employee = e2.Employee
                      AND Children LIKE 'E%');

如果没有一个返回的员工应该有一个以 . 开头的孩子E

查看版本一版本二

ps基于你的结构

SELECT E.EMPLOYEE_NAME, 
       E.EMPLOYEE_TITLE,
       E.EMPLOYEE_AGE, 
       C.CHILDREN_NAME
  FROM EMPLOYEE E INNER JOIN CHILDREN C ON E.EMPLOYEE_ID = C.EMPLOYEE_ID
 WHERE NOT EXISTS (SELECT 1 
                     FROM CHILDREN C2
                    WHERE E.EMPLOYEE_ID = C2.EMPLOYEE_ID
                      AND C2.CHILDREN_NAME LIKE 'E%');

检查这个小提琴

于 2013-09-26T19:29:12.413 回答
0

这是 sql fiddle 中的 mysql 解决方案。我第二,你规范化你的数据并制作一个子表。

http://sqlfiddle.com/#!2/f52cc/8/0

于 2013-09-26T19:42:46.947 回答