Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL外部连接场景—提出时似乎很简单_Mysql_Sql - Fatal编程技术网

Mysql SQL外部连接场景—提出时似乎很简单

Mysql SQL外部连接场景—提出时似乎很简单,mysql,sql,Mysql,Sql,我对SQL有点生疏,这让我发疯。在我脑海中,一个简单的外部连接由于某种原因是不起作用的 t1: 第1栏、第2栏 101,1 101,2 101,3 102,2 t2: 第1栏、第2栏 1,一个 2,两个 三,三 4,四个 (其中t1.column2->t2.column1) 给定我要查找的数据集上面的表: 101,一个 101,两个 101,三个 101,空 102,空 102,两个 102,空 102,空 也许我想得太多了,我不知道。我试图为任何选择返回4行,在本例中,t1.column1

我对SQL有点生疏,这让我发疯。在我脑海中,一个简单的外部连接由于某种原因是不起作用的

t1:
第1栏、第2栏
101,1
101,2
101,3
102,2

t2:
第1栏、第2栏
1,一个
2,两个
三,三 4,四个

(其中t1.column2->t2.column1)

给定我要查找的数据集上面的表:
101,一个
101,两个
101,三个
101,空

102,空
102,两个
102,空
102,空

也许我想得太多了,我不知道。我试图为任何选择返回4行,在本例中,t1.column1=101或t1.column1=102等

SELECT
   t1.column1, t2.column2
FROM t1
   LEFT JOIN t2 ON t1.column2 = t2.column1
应该这样吗


应该可以了?

听起来你想要的是:

SELECT sq.column1,
       CASE WHEN EXISTS
                  ( SELECT 1
                      FROM t1
                     WHERE column1 = sq.column1
                       AND column2 = t2.column1
                  )
            THEN t2.column2
        END
  FROM ( SELECT DISTINCT
                column1
           FROM t1
       ) sq
 CROSS
  JOIN t2
;

听起来你想要的是:

SELECT sq.column1,
       CASE WHEN EXISTS
                  ( SELECT 1
                      FROM t1
                     WHERE column1 = sq.column1
                       AND column2 = t2.column1
                  )
            THEN t2.column2
        END
  FROM ( SELECT DISTINCT
                column1
           FROM t1
       ) sq
 CROSS
  JOIN t2
;
上述内容的变更(意见中建议):

上述内容的变更(意见中建议):



结果只有五行(问题中列出的resultset中的第1-4行和第6行),而不是全部的八行。哦,对不起,我以为你想拿回4行。听起来你可能想让t2来驱动查询,所以请看右连接而不是左连接,结果只有五行(问题中列出的resultset中的第1-4行和第6行),而不是全部八行。哦,对不起,我以为你想拿回4行。听起来您可能想让t2驱动查询,因此,如果可以避免交叉连接,那么查看右连接而不是左连接不是一个好主意,特别是因为这并不是您真正想要的结果。如果表变大,性能会很差。@dbenham:我同意交叉连接通常不是很理想,但这正是问题所要求的。如果t1中有N行,t2中有M行,那么答案将由N×M行组成,就像叉积由N×M行组成一样。@Andrey简化了交叉连接方法。@JonathanLeffle:谢谢-在看到Andrey的解决方案(IMHO中的高级答案)之前,我完全忽略了问题的交叉连接方面。如果可以避免交叉联接,则交叉联接不是一个好主意,尤其是因为这并不是您真正想要的结果。如果表变大,性能会很差。@dbenham:我同意交叉连接通常不是很理想,但这正是问题所要求的。如果t1中有N行,t2中有M行,那么答案将由N×M行组成,就像叉积由N×M行组成一样。@Andrey简化了交叉连接方法。@JonathanLeffle:谢谢-在看到Andrey的解决方案(IMHO中的高级答案)之前,我完全忽略了问题的交叉连接方面。与@ruakh类似,我一开始并不知道。@ypercube:谢谢你的编辑,但你的版本和我原来的版本一样错误。要实现OP的输出,第一列应取自
td
,第二列(预计包含空值)取自
t1
。是的,我的坏消息。不过,答案并没有给出OP要求的100%。应该还有一个加入到
t2
,因此显示的是
'two'
,而不是
2
@ypercube:当然,谢谢!或者,也可以像我更新后的答案中那样。我必须说,很容易被这些毫无意义的
column1
columnX
名称弄糊涂。结果与@ruakh的名称相似,这是我最初没有意识到的。@ypercube:谢谢编辑,但你的版本和我原来的版本一样错误。要实现OP的输出,第一列应取自
td
,第二列(预计包含空值)取自
t1
。是的,我的坏消息。不过,答案并没有给出OP要求的100%。应该还有一个加入到
t2
,因此显示的是
'two'
,而不是
2
@ypercube:当然,谢谢!或者,也可以像我更新的答案中那样做。我必须说,很容易被这些毫无意义的
column1
columnX
名称所迷惑。
SELECT
  td.column1,
  CASE WHEN t1.column2 IS NOT NULL THEN t2.column2 END AS column2
FROM (SELECT DISTINCT column1 FROM t1) AS td
CROSS JOIN t2
LEFT JOIN  t1 ON t1.column1 = td.column1 AND t1.column2 = t2.column1
SELECT
  t1_d.column1,
  t2_2.column2
FROM (SELECT DISTINCT column1 FROM t1) AS t1_d
CROSS JOIN t2
LEFT JOIN  t1
  INNER JOIN t2 AS t2_2 ON t1.column2 = t2_2.column1
ON t1.column1 = t1_d.column1 AND t1.column2 = t2.column1