【问题标题】:Fetching distinct rows from multiple joins SQL从多个连接 SQL 中获取不同的行
【发布时间】:2017-09-10 15:01:16
【问题描述】:

我有一个名为deliveries 的主表,它与deliveries_languages 作为dl、deliveries_markets dm 和deliveries_tags dt 具有一对多关系,deliveries_tags dt 具有deliveries_id 作为外键。这 3 个表分别与语言、市场和标签具有一对一的关系。另外,deliveries,table 与 company 具有一对一的关系,并且 company_is 作为外键。以下是我写的一个查询:

SELECT deliveries.*, languages.display_name, markets.default_name, tags.default_name, companies.name
FROM deliveries
JOIN deliveries_languages dl ON dl.delivery_id = deliveries.id 
JOIN deliveries_markets dm ON dm.delivery_id = deliveries.id 
JOIN deliveries_tags dt ON dt.delivery_id = deliveries.id 
JOIN languages ON languages.id = dl.language_id 
JOIN markets ON markets.id = dm.market_id 
JOIN tags ON tags.id = dt.tag_id 
JOIN companies ON companies.id = deliveries.company_id 
WHERE 
deliveries.name ILIKE '%new%' AND 
deliveries.created_by = '5f331347-fb58-4f63-bcf0-702f132f97c5' AND 
deliveries.deleted_at IS NULL 
LIMIT 10

这里我得到了多余的delivery_id,因为每个delivery_id 都有多种语言、市场和标签。我想对不同的delivery_ids 使用限制。因此,限制 10 不应该给我来自上述连接查询的 10 条记录,而是给我 10 条具有不同 Delivery_id (deliveries.id) 的记录。我可能可以在这里使用派生表概念,但我不确定我该怎么做。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 每个delivery_id如何选择这10行? (保留几种语言似乎有点奇怪。)
  • 我正在使用 postgreSQL
  • 基本上我想在deliveries.id上进行分组。可以使用子查询,但我不知道该怎么做

标签: sql postgresql join


【解决方案1】:

在 Postgres 中,你可以使用distinct on:

SELECT DISTINCT ON (d.id) d.*, l.display_name, m.default_name, t.default_name, c.name
FROM deliveries d JOIN
     deliveries_languages dl
     ON dl.delivery_id = d.id JOIN
     deliveries_markets dm
     ON dm.delivery_id = d.id JOIN
     deliveries_tags dt
     ON dt.delivery_id = d.id JOIN
     languages l
     ON l.id = dl.language_id JOIN
     markets m
     ON m.id = dm.market_id JOIN
     tags
     ON t.id = dt.tag_id JOIN
     companies c
     ON  c.id = d.company_id 
WHERE d.name ILIKE '%new%' AND 
      d.created_by = '5f331347-fb58-4f63-bcf0-702f132f97c5' AND 
      d.deleted_at IS NULL 
ORDER BY d.id
LIMIT 10;

对于大量数据,这可能非常低效。像这样使用多个连接表会产生笛卡尔积。但是,对于少量数据,这应该可以解决您的问题。

【讨论】:

  • 这对我有用。但是你说性能会受到影响。是因为多个连接还是因为 DISTINCT ON 子句?还有,是不是比使用子查询更高效?
  • @NilakshiNaphade 。 . .这是因为连接在不同维度上产生笛卡尔积。 . .对于给定的交付,中间结果是语言数量乘以市场数量乘以标签数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 2010-10-21
  • 1970-01-01
相关资源
最近更新 更多