【问题标题】:I want to cross join two table but shows one of the table NULL's values. Should i use right outer join?我想交叉连接两个表,但显示表 NULL 的值之一。我应该使用右外连接吗?
【发布时间】:2019-11-04 12:56:49
【问题描述】:

我有一个 Table1:

IdT1,IdT1Group

11、30

12、30

13、30

表2:

IdT2、IdT1、详细信息

2、11、A

3、11、B

4、12、A

5、12、B

我希望我的查询是:

IdT2、IdT1、详细信息

2、11、A

3、11、B

2、12、A

3、12、B

NULL , 13 , A

NULL , 13 , B​​p>

所以,我使用交叉连接:

SELECT  table2.IdT2, 
        table1.IdT1, table2.Detail
FROM    table2 CROSS JOIN table1
WHERE   table2.IdT1 = 11 AND table1.IdT1Group = 30

但是在我尝试了我的代码之后,它是:

IdT2    IdT1    Detail

2   ,   11  ,   A

3   ,   11  ,   B

2   ,   12  ,   A

3   ,   12  ,   B

2   ,   13  ,   A

3   ,   13  ,   B

应该是这样的:

IdT2, IdT1, Detail

2   ,   11 ,    A

3   ,   11 ,    B

2   ,   12 ,    A

3   ,   12 ,    B

NULL , 13  ,    A

NULL , 13  ,    B

如果我使用这个查询:

SELECT  T2.IdT2, tblJoin.IdT1, tblJoin.Detail

FROM    Table2 AS T2 RIGHT JOIN
    (SELECT Table2.IdT2, 
            Table1.IdT1, Table2.Detail 
     FROM   Table2 CROSS JOIN Table1 WHERE  Table2.IdT1 = 11 AND Table1.IdT1Group = 30
    )   AS tblJoin ON T2.IdT1 = tblJoin.IdT1 And T2.IdT2 = tblJoin.IdT2 ORDER BY IdT2

结果是:

IdT2,IdT1,详细信息

NULL , 12 , A

NULL , 12 , B​​p>

NULL , 13 , A

NULL , 13 , B​​p>

2、11、A

3、11、B

如果表 2 上的数据是:

IdT2、IdT1、详细信息

2、11、A

3、11、B

4、11、C

5、12、A

6、12、B

,我期望的选择数据是:

IdT2 ; IdT1 ;详情

2、11、A

3、11、B

4、11、C

2、12、A

3、12、B

NULL , 12 , C

NULL , 13 , A

NULL , 13 , B​​p>

NULL , 13 , C

【问题讨论】:

  • 怎么知道idt1 = 13有两个细节A和B?
  • 实际上我是选择 IdT1 = 11 的行作为交叉连接的键,所以如果在 IdT1 (11) 上在表 2 上有 3 个详细信息,我期望的选择数据将是: IdT2 : 2,3,4, 2,3,4 Null,Null,Null ; IdT1 : 11,11,11,12,12,12,13,13,13 详细信息 : A,B,C, A,B,C, A,B,C
  • 请使用更多示例数据编辑您的帖子,而不是在评论中添加信息。
  • 你不可能得到你所说的结果。 WHERE table2.IdT2 = 2 的 WHERE 子句将阻止结果中包含 idT2=3 的行。
  • 哦,是的,我错了,它是:WHERE table2.IdT1 = 11(我想交叉加入 Table1.11 对所有其他 11 组(30)的详细信息)

标签: sql-server select left-join cross-join right-join


【解决方案1】:

根据我在这里看到的您的结果集,您可能想要接近这个的东西。尽管在没有太多背景的情况下具有挑战性。看看这是否能让你更接近你想要的:)

SELECT t2.IdT2, t1.IdT1, d.Detail 
FROM Table1 t1
LEFT OUTER JOIN Table2 t2 ON t1.IdT1 = t2.IdT1
CROSS JOIN (SELECT Detail FROM Table2 WHERE idT1=11 ) d
WHERE t1.IdT1Group=30

【讨论】:

  • 1,别名应为 t1。 2、t1没有列[详细]。
  • 谢谢。我没有为此的编译器。
  • 但是您的查询将返回带有空详细信息的 idt1 = 13。你可以在这里看到你的查询输出:dbfiddle.uk/…
  • 感谢万根。 dbfiddle 有帮助!以前没用过。
【解决方案2】:

试试这个-

WITH Table1( IdT1, IdT1Group)
AS
(
    SELECT 11, 30 UNION ALL
    SELECT 12, 30 UNION ALL
    SELECT 13, 30
),
Table2(IdT2 , IdT1, Detail)
AS
(
    SELECT 2 , 11 , 'A' UNION ALL
    SELECT 3 , 11 , 'B' UNION ALL
    SELECT 4 , 12 , 'A' UNION ALL
    SELECT 5 , 12 , 'B'
)

SELECT D.IdT2,C.IdT1,C.Detail FROM 
(
    SELECT IdT1, Detail FROM 
    (
        SELECT DISTINCT 1 JK,Detail FROM Table2
        -- Return DISTINCT LIST of Details as I seen 
        -- You established relation between all Distinct Details
        -- With All Number. JK (Joined Key) = 1 Generated so that 
        -- I can join both table by that number to create all to 
        -- all combination
    )A
    INNER JOIN 
    (
        SELECT 1 JK,* FROM Table1
        -- JK (Joined Key) = 1 Generated so that I can join 
        -- both table by that number to create all to all combination
    )B ON A.JK = B.JK
)C
LEFT JOIN Table2 D ON C.IdT1 = D.IdT1 AND C.Detail = D.Detail
ORDER BY 2

输出是-

IdT2    IdT1    Detail
2       11      A
3       11      B
5       12      B
4       12      A
NULL    13      A
NULL    13      B

【讨论】:

  • 感谢您的建议,但有一个小错误,我想得到 12(IdT1) 的 IdT2 与 11(IdT1) 相同
  • 使用 Table2 中更改的数据,您期望有一个组合为 '2 , 12 , A' 的行。你能解释一下逻辑吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2018-09-29
  • 2016-11-29
  • 2021-10-12
相关资源
最近更新 更多