即使不使用 ON 不满足子条件,仍然获取父记录
Fetch Parent Record anyway even if child condition doesn't meet without using ON
我有两个表 Employee 和 Address。
一个员工可以有多个地址。
在这里,我想获取特定 emp_id 的 'active employee details' 和 'active address details'。我可以通过以下查询实现此目的:
Table Structure:
Employee(emp_id,name,is_active)
Address(add_id,emp_id,address,is_active)
查询:
SELECT * FROM EMPLOYEE e
LEFT OUTER JOIN ADDRESS a
ON e.emp_id=a.emp_id
WHERE e.is_active='A'
AND a.is_active='A';
使用上面的查询,如果没有有效地址,它不会 return 任何员工详细信息。我想 return 活跃员工的详细信息,即使它没有任何活跃地址。
注意:因为我正在使用 Hibernate 查找不使用 ON 的查询。这里只能使用Where子句。
请多多指教。
您需要将 a.is_active='A'
放在 ON
子句中而不是 WHERE
子句中
SELECT * FROM EMPLOYEE e
LEFT OUTER JOIN ADDRESS a
ON e.emp_id=a.emp_id AND a.is_active='A'
WHERE e.is_active='A';
由于您在 on
子句中使用条件有限制,您可以尝试以下方法。它将 return 地址处于活动状态或地址不可用的行(假设地址 table 中的 is_active 列永远不会为空)。
Schema and insert statements:
create table EMPLOYEES(emp_id int, name varchar(20), is_active varchar(10));
create table Address(add_id int ,emp_id int ,address varchar(50),is_active varchar(10));
insert into EMPLOYEES values (1,'NAME1','A');
insert into Address values(1,1,'addr1','N');
insert into Address values(2,1,'addr1','N');
查询:
SELECT * FROM EMPLOYEES e
LEFT OUTER JOIN (select * from Address where is_active='A') a
ON e.emp_id=a.emp_id
WHERE e.is_active='A'
AND (a.is_active='A' or a.is_active is null);
输出:
EMP_ID
NAME
IS_ACTIVE
ADD_ID
EMP_ID
ADDRESS
IS_ACTIVE
1
NAME1
A
null
null
null
null
db<>fiddle here
我有两个表 Employee 和 Address。 一个员工可以有多个地址。 在这里,我想获取特定 emp_id 的 'active employee details' 和 'active address details'。我可以通过以下查询实现此目的:
Table Structure:
Employee(emp_id,name,is_active)
Address(add_id,emp_id,address,is_active)
查询:
SELECT * FROM EMPLOYEE e
LEFT OUTER JOIN ADDRESS a
ON e.emp_id=a.emp_id
WHERE e.is_active='A'
AND a.is_active='A';
使用上面的查询,如果没有有效地址,它不会 return 任何员工详细信息。我想 return 活跃员工的详细信息,即使它没有任何活跃地址。
注意:因为我正在使用 Hibernate 查找不使用 ON 的查询。这里只能使用Where子句。
请多多指教。
您需要将 a.is_active='A'
放在 ON
子句中而不是 WHERE
子句中
SELECT * FROM EMPLOYEE e
LEFT OUTER JOIN ADDRESS a
ON e.emp_id=a.emp_id AND a.is_active='A'
WHERE e.is_active='A';
由于您在 on
子句中使用条件有限制,您可以尝试以下方法。它将 return 地址处于活动状态或地址不可用的行(假设地址 table 中的 is_active 列永远不会为空)。
Schema and insert statements:
create table EMPLOYEES(emp_id int, name varchar(20), is_active varchar(10));
create table Address(add_id int ,emp_id int ,address varchar(50),is_active varchar(10));
insert into EMPLOYEES values (1,'NAME1','A');
insert into Address values(1,1,'addr1','N');
insert into Address values(2,1,'addr1','N');
查询:
SELECT * FROM EMPLOYEES e
LEFT OUTER JOIN (select * from Address where is_active='A') a
ON e.emp_id=a.emp_id
WHERE e.is_active='A'
AND (a.is_active='A' or a.is_active is null);
输出:
EMP_ID | NAME | IS_ACTIVE | ADD_ID | EMP_ID | ADDRESS | IS_ACTIVE |
---|---|---|---|---|---|---|
1 | NAME1 | A | null | null | null | null |
db<>fiddle here