如何在多个条件上加入,返回两个条件的所有组合
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
【讨论】:
以上是关于如何在多个条件上加入,返回两个条件的所有组合的主要内容,如果未能解决你的问题,请参考以下文章