加入或联盟或子查询或其他什么?

时间:2011-02-03 14:14:24

标签: sql sql-server tsql

我有两个表需要为一个不同的集合加入/ union - 但是到目前为止我尝试的每个查询都会导致返回的行太少/太多。

table one    table two
ID           Type
Type         SubType
SubType
Percentage
Category

表一是主要数据集,表二是查找值。

数据是这样的:

table one
1, A, ZZZ, 20.00, CAR
2, A, YYY, 80.00, CAR
3, B, YYY, 100.00, VAN
4, A, WWW, 100.00, BUS

table two
A, WWW
A, XXX
A, YYY
A, ZZZ
B, YYY
B, ZZZ

我最终想要的是以下数据集

1, A, YYY, 80.00, CAR
2, A, ZZZ, 20.00, CAR
0, A, WWW, 0.00, CAR
0, A, XXX, 0.00, CAR
3, B, YYY, 100.00, VAN
0, B, ZZZ, 0.00, VAN
4, A, WWW, 100.00, BUS
0, A, XXX, 0.00, BUS
0, A, YYY, 0.00, BUS
0, A, ZZZ, 0.00, BUS

所以,换句话说,我希望表1中的所有数据PLUS从表2中找到任何丢失的子类型,这些子类型与表1的类型匹配,其中还包括ID和百分比的零值,但保持选择的数据集中的类别

如果我在表1中只有一行,这适用于外部联接,但对于每个后续行,我的查询会从表2中添加更多行。我想我需要某种联合或子查询,它们知道从表1中选择的其他行,因此只会从表2中选择不匹配的行。

最值得赞赏的任何帮助!

修改 这是我当前的查询(我想的越多,看起来就越错误)

SELECT CASE WHEN t1.SubType = t2.SubType THEN t1.ID ELSE 0 END,
t1.Type, t2.SubType, CASE WHEN t1.SubType = t2.SubType THEN
t1.Percentage ELSE 0 END, t1.Category
FROM one t1
LEFT OUTER JOIN two t2
ON t2.Type = t1.Type

这给了我8行 - 从表1中选择的每一行重复。

另一个编辑: 在表1中添加几行我认为更好地解释了这个问题。因此,创建表和添加行的SQL如下所示:

create table one (ID int,Type nvarchar(1),SubType nvarchar(3),Percentage decimal(5,2),Category nvarchar(3))
create table two (Type nvarchar(1),SubType nvarchar(3))
insert into one values (1, 'A', 'ZZZ', 20.00, 'CAR')
insert into one values (2, 'A', 'YYY', 80.00, 'CAR')
insert into one values (3, 'B', 'YYY', 100.00, 'VAN')
insert into one values (4, 'A', 'WWW', 100.00, 'BUS')
insert into two values ('A', 'WWW')
insert into two values ('A', 'XXX')
insert into two values ('A', 'YYY')
insert into two values ('A', 'ZZZ')
insert into two values ('B', 'YYY')
insert into two values ('B', 'ZZZ')

4 个答案:

答案 0 :(得分:1)

我认为这会做你想做的事情:

SELECT ID, Type, SubType, Percentage, Category
FROM Table1
UNION ALL
SELECT 0, Type, SubType, 0.00, 'CAR'
FROM Table2 t2
LEFT JOIN t1 ON t1.Type = t2.Type AND t1.SubType = t2.SubType
WHERE t1.ID IS NULL

答案 1 :(得分:0)

您可以在没有UNION的情况下执行此操作,只需LEFT JOIN
更新后的评论

SELECT ISNULL(t1.ID,0) Id, t2.Type, t2.SubType, ISNULL(t1.percentage,0) Percentage, ISNULL(t1.Category,'CAR') Category
FROM Table2 t2
LEFT JOIN Table1 t1
    ON t1.Type = t2.Type AND t1.SubType = t2.SubType
WHERE t2.Type IN (SELECT DISTINCT Type FROM Table1)

好的,这将为您提供所需的结果,但是如果您不希望这样,则会将类别指定为'CAR',那么您应该告诉我们它应该是什么。

答案 2 :(得分:0)

SELECT
  ISNULL(t1.ID),
  t2.Type,
  t2.SubType,
  ISNULL(t1.Percentage, 0),
  ISNULL(t1.Category, 'CAR')
FROM Table2 t2
  INNER JOIN (SELECT DISTINCT Type FROM Table1) f ON t2.Type = f.Type
  LEFT JOIN Table1 t1 ON t2.Type = t1.Type AND t2.SubType = t1.SubType

答案 3 :(得分:0)

感谢大家对此的帮助,但我终于自己解决了......

SELECT ID, Type, SubType, Percentage, Category
FROM one
UNION
    SELECT DISTINCT 0, t2.Type, t2.SubType, 0.00, t1.Category
    FROM one t1
    INNER JOIN two t2 ON t2.Type = t1.Type AND t2.SubType NOT IN
        (SELECT t3.SubType FROM one t3 WHERE t3.Category = t1.Category and t3.Type = t1.Type)
ORDER BY Category, Type, SubType