我需要在需要返回单行的查询中加入两个表。从一个表中我将选择一个始终存在的行。从第二个开始,我需要选择两行,其中一行将始终存在,另一行仅在有时存在。
我可以在第二个表中存在两行而不存在第二行的情况下使这个工作。
以下是我的架构的简化示例
表1:公司
COMPANY_ID int
------------
|COMPANY_ID|
------------
| 1|
| 2|
------------
表2:偏好
COMPANY_ID int,
PREFERENCE_ID int,
PREFERENCE_VALUE varchar
-------------------------------------------
|COMPANY_ID|PREFERENCE_ID|PREFERENCE_VALUE|
-------------------------------------------
| 1| 1| foo|
| 1| 2| bar|
| 2| 1| baz|
-------------------------------------------
我正在寻找的是一个查询,当COMPANY_ID = 1时,它将返回包含PREFERENCE_ID的行,当COMPANY_ID = 2时,返回一行PREFERENCE_ID和空单元格(或零或任何默认值)。
我正在尝试使用像
这样的查询select c.*, p1.PREFERENCE_VALUE as VALUE1, p2.PREFERENCE_VALUE as VALUE2
from
COMPANIES
join PREFERENCES p1 on c.ID = p1.COMPANY_ID
join PREFERENCES p2 on c.ID = p2.COMPANY_ID
where
p1.PREFERENCE_ID = 1 and
p2.PREFERENCE_ID = 2 and
COMPANIES.ID = 1;
当我使用COMPANY_ID = 1(其中有PREFERENCE_IDs 1 和 2)运行此查询时,它运行正常。当我使用COMPANY_ID = 2运行它时,它返回一个空集。我尝试过使用第二次连接的左连接,但不会改变任何内容。
我希望它返回:
查询中的COMPANY_ID = 1:
------------------
|ID|VALUE1|VALUE2|
------------------
| 1| foo| bar|
------------------
并且对于COMPANY_ID = 2,它可以为VALUE2返回任何内容。 null,空白,0,我不在乎:
------------------
|ID|VALUE1|VALUE2|
------------------
| 2| baz| |
------------------
任何建议的TIA。
答案 0 :(得分:2)
问题是WHERE
子句。 LEFT JOIN
将返回空值并准确生成您要查找的内容,但查询中的WHERE
会否定该内容。
select c.*, p1.PREFERENCE_VALUE as VALUE1, p2.PREFERENCE_VALUE as VALUE2
from
COMPANIES
inner join PREFERENCES p1
on c.ID = p1.COMPANY_ID and p1.PREFERENCE_VALUE = 1
left outer join PREFERENCES p2
on c.ID = p2.COMPANY_ID and p2.PREFERENCE_VALUE = 2
where
COMPANIES.ID = 1;