0

我有两个表需要加入一个需要返回单行的查询。从一个表中,我将选择永远存在的行。从第二个开始,我需要选择两行,其中之一将始终存在,而另一行仅有时存在。

我可以在第二个表中的两行都存在但第二行不存在的情况下进行这项工作。

这是我的架构的简化示例

表 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_ID 12,它工作正常。当我使用 COMPANY_ID = 2 运行它时,它返回一个空集。我尝试使用左连接进行第二次连接,但这并没有不要改变任何东西。

我希望它返回:

COMPANY_ID = 1 在查询中:

------------------
|ID|VALUE1|VALUE2|
------------------
| 1|   foo|   bar|
------------------

对于 COMPANY_ID=2,它可以为 VALUE2 返回任何内容。null,空白,0,我不在乎:

------------------
|ID|VALUE1|VALUE2|
------------------
| 2|   baz|      |
------------------

TIA 的任何建议。

4

1 回答 1

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;
于 2013-04-02T18:55:47.510 回答