0

我被这个难住了。简而言之,我有 3 个表:Product、Ranging、Account。Ranging 是中间表,它是 Product 和 Account 之间的链接。

例如,测距记录链接到 1 个帐户和 1 个产品。产品可以有很多范围,帐户也可以。

我想要结束的是 3 列:1 = 产品名称,2 = 帐户名称,3 = 范围(存在(是/否)。这很容易,但棘手的是我想在下显示每个帐户每个产品。

即,如果我有 PROD 1、2 和 3 以及帐户 A、B 和 C。我想看看:

  • 产品 1 - 账户 A - 测距状态(是/否)
  • 产品 1 - 账户 B - 测距状态(是/否)
  • 产品 1 - 账户 C - 测距状态(是/否)
  • 产品 2 - 账户 A - 测距状态(是/否)
  • 产品 2 - 账户 B - 测距状态(是/否)
  • 产品 2 - 账户 C - 测距状态(是/否)
  • 产品 3 - 账户 A - 测距状态(是/否)
  • 产品 3 - 账户 B - 测距状态(是/否)
  • 产品 3 - 账户 C - 测距状态(是/否)

帐户、产品和范围都有关联的 ID(PK、FK 等)

我尝试过使用内部连接进行交叉连接,但无济于事。感谢帮助!

4

2 回答 2

0

你在找这个吗?

SELECT q.product_name, q.account_name,
       CASE WHEN r.product_id IS NULL THEN 'no' ELSE 'yes' END status
  FROM 
(
  SELECT product_id, product_name, account_id, account_name
    FROM product p CROSS JOIN account a
) q LEFT JOIN ranging r
    ON q.product_id = r.product_id
   AND q.account_id = r.account_id
 ORDER BY q.product_name, q.account_name

样本输出:

| PRODUCT_NAME | 帐户名 | 状态 |
--------------------------------------
| 产品 1 | 账户 A | 是的 |
| 产品 1 | 账户 B | 没有 |
| 产品 1 | 账户 C | 是的 |
| 产品 2 | 账户 A | 是的 |
| 产品 2 | 账户 B | 没有 |
| 产品 2 | 账户 C | 没有 |
| 产品 3 | 账户 A | 没有 |
| 产品 3 | 账户 B | 没有 |
| 产品 3 | 账户 C | 没有 |

这是SQLFiddle演示

于 2013-08-22T04:02:56.837 回答
0

你需要交叉加入来做到这一点:

  select
      p.name as product_name,
      a.name as account_name,
      case when r.product_id is not null then 'yes' else 'no' end as Ranging
  from product as p
      cross join account as a
      left outer join ranging as r on r.product_id = p.id and r.account_id = a.id
  order by p.name, a.name
于 2013-08-22T05:33:27.490 回答