首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何仅使用内部联接创建左联接?

如何仅使用内部联接创建左联接?
EN

Stack Overflow用户
提问于 2016-09-12 15:25:13
回答 7查看 561关注 0票数 4

最近我进行了一次面试,有人问我如何仅使用内部联接来创建左联接。面试官对我说,他们在公司中使用的一些软件不允许使用左联接,所以我们必须使用内部连接来完成它们。我被这个问题搞砸了,我想知道这里有人知道怎么做吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-09-12 15:44:50

这是我的裂缝。它基本上是将内部连接转换为交叉应用,然后如果不匹配实际所需的连接条件,则NULLing out值。

代码语言:javascript
运行
复制
CREATE TABLE #testusers (userid INT)

CREATE TABLE #testusers2 (userID INT)

INSERT INTO #testusers (userid)
VALUES (1)
    , (2)
    , (3)

INSERT INTO #testusers2 (userid)
VALUES (2), (5), (1)


--Expecting to see one result due to straight inner join
SELECT t1.*
    , t2.*
FROM #testusers t1
INNER JOIN #testusers2 t2
    ON t1.userid = t2.userid

--Forcing all results by basically doing a cross apply and then NULLing out non matching values based on the join condition
SELECT distinct t1.*
    , MAX(CASE 
        WHEN t1.userid <> t2.userID
            THEN NULL
        ELSE t2.userid
        END) AS userid
FROM #testusers t1
INNER JOIN #testusers2 t2
    ON t1.userid = t2.userid
        OR 1 = 1
GROUP BY t1.userid

也为VARCHAR工作。

代码语言:javascript
运行
复制
CREATE TABLE #testusersnames (username varchar(10))

CREATE TABLE #testusersnames2 (username varchar(10))

INSERT INTO #testusersnames (username)
VALUES ('Tom')
    , ('Jane')
    , ('Dick')

INSERT INTO #testusersnames2 (username)
VALUES ('Tom'), ('Sally'), ('Mary')

SELECT t1.*
    , t2.*
FROM #testusersnames t1
INNER JOIN #testusersnames2 t2
    ON t1.username = t2.username

--Forcing all results by basically doing a cross apply and then NULLing out non matching values based on the join condition
SELECT distinct t1.*
    , MAX(CASE 
        WHEN t1.username <> t2.username
            THEN NULL
        ELSE t2.username
        END) AS username
FROM #testusersnames t1
INNER JOIN #testusersnames2 t2
    ON t1.username = t2.username
        OR 1 = 1
GROUP BY t1.username
票数 3
EN

Stack Overflow用户

发布于 2016-09-12 15:50:12

这是我的尝试。在http://sqliteonline.com/上验证

限制:我将不得不“空”出我不想被返回的列。

编辑 OP说没有UNION,因此这个答案不适用。

代码语言:javascript
运行
复制
CREATE TABLE demo (id int, name varchar(32));

CREATE TABLE demo_details (demo_id int, description varchar(64));

INSERT INTO demo_details
VALUES (1,
        'Woohooooooooo');

SELECT *
FROM demo d
INNER JOIN demo_details dd ON d.id = dd.demo_id
UNION
SELECT d.*,
       NULL,
       NULL
FROM demo d
INNER JOIN demo_details dd ON d.id <> dd.demo_id;
票数 1
EN

Stack Overflow用户

发布于 2016-09-12 15:54:44

这个怎么样:

代码语言:javascript
运行
复制
SELECT * 
FROM Table1 t1
INNER JOIN (
  SELECT * FROM Table2
  UNION 
  SELECT {NULL for every column in Table2}
) t2
  ON 1=1
WHERE t1.id = t2.id
OR t2.id IS NULL
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39453813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档