如何在多个条件上加入,返回两个条件的所有组合

Posted

技术标签:

【中文标题】如何在多个条件上加入,返回两个条件的所有组合【英文标题】: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。 【参考方案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
SEE SQLFiddle Demo

【讨论】:

虽然我一定会记住该网站以备将来解决问题,但呈现的结果是我目前得到的结果,而不是我需要的结果。结果应该是 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

【讨论】:

以上是关于如何在多个条件上加入,返回两个条件的所有组合的主要内容,如果未能解决你的问题,请参考以下文章

if函数多个条件怎么用 if函数多个条件如何使用啊

在 Access 中使用多个组合框作为查询条件不能一起使用,但使用一个组合框可以吗?如何使所有组合框工作?

Excel中,如何多条件判断,输出结果

根据大型列表的多个条件查找所有组合

如何合并具有相同列名的多个数据框?

如何筛选多个条件