MySQL的左外连接排除
我有2代表“conta
”和“details
”和两个表在不同的情况下,空值和数据MySQL的左外连接排除
conta id col1 col2 col3 col4
1 Hi Bye See YOU
2 Hello (NULL) (NULL) (NULL)
details
id new_column1 new_column2 new_column3
1 bye see you
我想联接基于col2=new_column1 and col3 = new_column2 and col4 = new_column3
申请并获得价值存在于conta
,而不是在details
,所以我的输出将是
conta id col1 col2 col3 col4
2 hello (NULL) (NULL) (NULL)
但不知何故,我不能这样做。我写下面的查询,但它根本不会导致我想要的值。
SELECT `id`,`col1`,`col2`,`col3`,`col4` FROM `conta` WHERE LOWER(`col2`) + LOWER(`col3`) + LOWER(`col4`) NOT IN (SELECT DISTINCT(LOWER(`new_column1`) + LOWER(`new_column2`) + LOWER(`new_column3`))
FROM `details`);
它只是给我没有结果!在显示屏上
任何帮助?
编辑:我试着在@Uueerdo建议的下面查询,它并没有给我我想要的。
SELECT conta.id,`col1`,`col2`,`col3`,`col4` FROM `conta` LEFT OUTER JOIN `details`
ON ((conta.col2 IS NULL AND details.new_column1 IS NULL)
OR (LOWER(conta.col2) = LOWER(details.new_column1)))
AND ((conta.col3 IS NULL AND details.new_column2 IS NULL)
OR (LOWER(conta.col3) = LOWER(details.new_column2)))
AND ((conta.col4 IS NULL AND details.new_column3 IS NULL)
OR (LOWER(conta.col4) = LOWER(details.new_column3)))
WHERE details.id IS NULL
在输出中col2
我看到的值“操作”,其也存在于new_column1
在details
表。这意味着,因为我想申请左外连接排除我甚至使用LEFT JOIN代替LEFT OUTER JOIN试过它不应该存在于输出和它不工作要么
EDIT2:我找到了解决方案。查询工作并完成这项工作。 Exept,我不得不运行一个命令来替换我应用连接到NULL值的列中的所有空白单元格。
回答:
你最好用SELECT .... FROM a LEFT JOIN b ON conditions WHERE b.id IS NULL
风格的查询;空比较有点不同(并且可以处理连接条件)。
例如,这些计算为NULL,这是不是真的,哪个是假的:
- NULL = NULL
- 空值(NULL)
但你可以做这样的事情能够更容易地比较空值:
- ISNULL(A,X)= ISNULL(b,X)
- (a为null,B是NULL)
所以你连接条件可以是这样的:
[...] ON ((conta.col2 IS NULL AND details.new_column1 IS NULL)
OR (LOWER(conta.col2) = LOWER(details.new_column1)))
AND ((conta.col3 IS NULL AND details.new_column2 IS NULL)
OR (LOWER(conta.col3) = LOWER(details.new_column2)))
[and so on...]
WHERE details.id IS NULL
这是假定details
具有某种非空行标识字段,可以使用可靠地确定是否匹配。
编辑:您当前的查询(除了我前面提到的空问题)准确的问题是,+
是不能在MySQL中串联,这是加法。使用数据显示LOWER(col2) + LOWER(col3) + LOWER(col4)
和LOWER(new_column1) + LOWER(new_column2) + LOWER(new_column3)
以及产量0
的行中没有NULL值。您需要使用CONCAT()
函数来执行操作;但我会劝阻它,因为CONCAT('abc', 'def', '')
等于CONCAT('ab', 'cd', 'ef')
。
旁注:DISTINCT
不是一个功能,()
将没有效果(比,如果他们包含不止一个结果场可能会导致一个问题等)。
你可以把你的一般格式,和上述空问题,用此格式的简单变化:WHERE (a, b, c) IN (SELECT a, b, c FROM ....
回答:
您可以使用EXISTS
运算符来创建一个反半连接。请看看这个链接:https://www.techonthenet.com/mysql/exists.php
实例查询:
SELECT id,
col1,
col2,
col3,
col4
FROM conta
WHERE NOT EXISTS (
SELECT 1
FROM details
WHERE conta.col2 LIKE details.new_column1
AND conta.col3 LIKE details.new_column2
AND conta.col4 LIKE details.new_column3
)
回答:
你的问题的解决办法是内加入您的(通讯录)与(详细信息表) 并获得所有列其中(接触。*) Contact.col1!= details.new_column1
这里是一个查询
Select conta.* from conta inner join details on conta.col1!=details.new_column1
你可以和更多凡内柱加入
回答:
您可以执行左连接,然后在第二个表中测试空值以查找第一个表中与第二个表中的任何行不匹配的行。
SELECT a.`id`,
a.`col1`,
a.`col2`,
a.`col3`,
a.`col4`
FROM `conta` a
LEFT JOIN `details` b
ON a.`col2` like b.`new_column1`
AND a.`col3` like b.`new_column2`
AND a.`col4` like b.`new_column3`
WHERE b.`id` IS NULL
以上是 MySQL的左外连接排除 的全部内容, 来源链接: utcz.com/qa/265934.html