【问题标题】:SQL query for to find item with a specific attribute and related non-foreign keyed items用于查找具有特定属性的项目和相关的非外键项目的 SQL 查询
【发布时间】:2016-02-19 04:26:40
【问题描述】:

我正在尝试编写一个 sql 查询来返回具有特定属性并且也被非外键项引用的项列表。说明一下,假设表一是汽车,它具有注册状态。表二是停车许可证,它有一个 car_id 的非外键字段,它是一个表示汽车 ID 的 int。我想返回一份注册状态为“活动”且至少有一个带有其 ID 的许可证的汽车列表。

我尝试了内部和左联接与 where 的不同组合,但我无法让它返回我需要的内容。

有没有办法计算每辆车的连接返回的许可证数量?或者有没有我想念的更简单的方法?

【问题讨论】:

  • @TomH 我一直在寻求提高自己,所以我很高兴收到关于我的问题的批评,但你能否具体说明我应该改进我的问题而不是简单地在如何提问页面上点赞?
  • 该页面列出了我能说的所有内容。提供表结构、示例数据、预期输出、您自己的尝试以及他们的结果出了什么问题。

标签: mysql sql postgresql relational-database


【解决方案1】:

类似:

选择汽车。*
从汽车
WHERE cars.reg_status='活动'
并且存在(选择 *
FROM 许可证
WHERE permit.car_id=cars.car_id);

这应该返回所有状态为活动且至少有 1 个许可证的汽车

顺便说一句:如果'permits'表通过car_id引用'cars'表,我强烈建议创建一个外键

【讨论】:

  • 这正是我所需要的。谢谢你。我没有考虑使用存在。
  • 另外,我完全同意创建外键。这是一个遗留代码库,我还没有接触到它,但它在列表中。
【解决方案2】:

您可以进行 JOIN 并计算匹配的 id:-

SELECT a.car_id
        COUNT(b.permit_id)
FROM cars a
INNER JOIN parking_permits b
ON a.car_id = b.car_id
WHERE a.registration_status = 'active'
GROUP BY a.car_id

如果您想在列表中包括那些没有任何停车许可证的人:-

SELECT a.car_id
        COUNT(b.permit_id)
FROM cars a
LEFT OUTER JOIN parking_permits b
ON a.car_id = b.car_id
WHERE a.registration_status = 'active'
GROUP BY a.car_id

【讨论】:

    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2022-12-04
    • 1970-01-01
    相关资源
    最近更新 更多