【问题标题】:How to do join on multiple criteria, returning all combinations of both criteria如何在多个条件上加入,返回两个条件的所有组合
【发布时间】:2012-10-19 08:23:57
【问题描述】:

我敢打赌这是一个非常简单的答案,因为我是 SQL 的菜鸟。

表 1 有第 1 列(标准 1)第 2 列(标准 2)第 3 列(指标 1)

表 2 具有第 1 列(标准 1)第 2 列(标准 2)第 3 列(特定于 table2.criteria2 的指标 2)

对于表格上的每个标准 1,标准 2 的值可以有 1 - 5 个。

当我在这里使用 join 语句时(假设我在此之前将表 1 标识为 One):

Select WeddingTable, TableSeat, TableSeatID, Name, Two.Meal
FROM table1 as One
inner join table2 as Two
on One.WeddingTable = Two.WeddingTable and One.TableSeat = Two.TableSeat

即使我知道有 3 或 4 种组合,我也只能获得标准 1/标准 2 组合中的一种。如何获得所有组合?

以举办婚礼为例,table 1 基本上是座位表,table 2 是每个桌子/座位选择的用餐选项。表 1 有方便的 TableSeatID,但表 2 没有可比较的 ID。

样本数据:

结果需要显示所有 4 行,即 WeddingTable 001 的所有 3 个座位和 WeddingTable 002 的一个座位。

期望的结果:

【问题讨论】:

  • 显示样本数据、预期结果和实际结果。
  • 您想要匹配任一条件的值吗?如果是这样,请使用 OR 而不是 AND
  • @tarheel 请提供示例数据,我们不知道您要在哪里搜索符合条件的值。
  • 根据您的示例数据,连接条件中的 AND 是正确的。如果您没有得到正确的结果,您的查询中可能还有其他问题。请按照您的尝试发布您的实际查询...
  • 您的原始查询works for me

标签: sql sql-server join


【解决方案1】:
select one.*, two.meal
from table1 as one
left join table2 as two
on (one.weddingtable = two.weddingtable and one.tableseat = two.tableseat)

【讨论】:

  • 你能解释一下区别吗?
  • 这个答案为您提供了表 1 中的所有数据,以及仅与表 2 中匹配的数据(on 子句)。它可以为同一个婚礼桌和桌椅选择 two.meal。如果表 1 包含表 2 中不存在的婚礼桌和桌椅的数据,则会出现差异。由于这是左连接,因此对于表 1 的不匹配输出行,您将获得 two.meal 的空值。跨度>
【解决方案2】:
create table a1
(weddingTable INT(3),
 tableSeat INT(3),
 tableSeatID INT(6),
 Name varchar(10));

insert into a1
 (weddingTable, tableSeat, tableSeatID, Name)
 values (001,001,001001,'Bob'),
 (001,002,001002,'Joe'),
 (001,003,001003,'Dan'),
 (002,001,002001,'Mark');

create table a2
 (weddingTable int(3),
 tableSeat int(3),
 Meal varchar(10));

insert into a2
(weddingTable, tableSeat, Meal)
values 
(001,001,'Chicken'),
(001,002,'Steak'),
(001,003,'Salmon'),
(002,001,'Steak');

select x.*, y.Meal

from a1 as x
JOIN a2 as y ON (x.weddingTable = y.weddingTable) AND (x.tableSeat = y. tableSeat);

【讨论】:

    【解决方案3】:
    SELECT  aa.*,
            bb.meal
    FROM    table1 aa
            INNER JOIN table2 bb
                ON aa.tableseat = bb.tableseat AND
                    aa.weddingtable = bb.weddingtable
            INNER JOIN
            (
                SELECT  a.tableSeat
                FROM    table1 a
                        INNER JOIN table2 b
                            ON a.tableseat = b.tableseat AND
                                a.weddingtable = b.weddingtable
                WHERE b.meal IN ('chicken', 'steak')
                GROUP by a.tableSeat
                HAVING COUNT(DISTINCT b.Meal) = 2
            ) c ON aa.tableseat = c.tableSeat
    

    【讨论】:

    • 虽然我一定会记住该网站以备将来解决问题,但呈现的结果是我目前得到的结果,而不是我需要的结果。结果应该是 4 行数据。
    • WHERE b.meal IN ('chicken', 'steak') 行不行,因为我根本无法输入这个特定字段在我的真实数据中的 2000 多种可能性。
    • 那么你将在应用层处理它。如果你认为不可能,那你将如何搜索呢?
    • 如何动态获取HAVING COUNT(DISTINCT b.Meal) = 2行中的2?以及如何动态添加('鸡','牛排')? (也就是 b.Meal 中所有可能的值)
    • 你可以从这里得到想法,PHP/MYSQL using an array in WHERE clause
    【解决方案4】:

    听起来您想列出所有指标?

    SELECT Criteria1, Criteria2, Metric1 As Metric
    FROM Table1
    UNION ALL
    SELECT Criteria1, Criteria2, Metric2 As Metric
    FROM Table2
    ORDER BY 1, 2
    

    如果您只想要一个 Criteria1+Criteria2 组合,请将它们分组:

    SELECT Criteria1, Criteia2, SUM(Metric) AS Metric
    FROM (
        SELECT Criteria1, Criteria2, Metric1 As Metric
        FROM Table1
        UNION ALL
        SELECT Criteria1, Criteria2, Metric2 As Metric
        FROM Table2
    )
    ORDER BY Criteria1, Criteria2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2021-11-29
      • 2017-08-16
      • 1970-01-01
      相关资源
      最近更新 更多