由于B.column1
不明确,我得到重复的行。
这就是为什么我只想要B
个表column2
包含'x'
或'y'
等条目的行'x'
,'y'
{ {1}},'z'
)。
'x'
的优先级超过'y'
,因此用户宁可'x'
而非'y'
。我认为最后一行中的条件可以解决这个问题:
SELECT
*
FROM A
LEFT JOIN B on B.column1=A.column1
AND B.column2= (IF(B.column2 = 'x','x','y'))
但事实证明它和我写的一样
AND (B.column2 = 'x' OR B.column2 = 'y')
- >它连接两行而不是一行。
这个问题有(好的)解决方案吗?请记住,我可能想要加入更多的表而不仅仅是一个表。
修改:
不能工作
(B.column2 = 'x' XOR B.column2 = 'y')
无法工作
(B.column2 = 'x' OR B.column2 = 'y') AND NOT (B.column2 = 'x' AND B.column2 = 'y')
我甚至不接受,因为它不是'x' rather than'y'
,而是either 'x' or 'y'
。
但它告诉我,我可能有错误的做法
EDIT2 :
我使用了Jean Jung稍微不同的方法:
我决定更深入地了解这个问题,因为我无法用conditional joins
来解决问题。现在这就是我想要加入的多个表的样子:
SELECT
*
FROM A
LEFT JOIN I on I.unique = A.unique
LEFT JOIN B on B.column1 = I.column1
LEFT JOIN J on J.unique = A.unique
LEFT JOIN B AS C on C.column1 = J.column1 and B.column2 = C.column2
LEFT JOIN K on K.unique = A.unique
LEFT JOIN B AS D on D.column1 = K.column1 and C.column2 = D.column2
WHERE B.column2 = 'x'
UNION
SELECT
*
FROM A
LEFT JOIN I on I.unique = A.unique
LEFT JOIN B on B.column1 = I.column1
LEFT JOIN J on J.unique = A.unique
LEFT JOIN B AS C on C.column1 = J.column1 and B.column2 = C.column2
LEFT JOIN K on K.unique = A.unique
LEFT JOIN B AS D on D.column1 = K.column1 and C.column2 = D.column2
WHERE B.column2 = '' AND A.unique NOT IN (
SELECT
A.unique
FROM A
LEFT JOIN I on I.unique = A.unique
LEFT JOIN B on B.column1 = I.column1
LEFT JOIN J on J.unique = A.unique
LEFT JOIN B AS C on C.column1 = J.column1 and B.column2 = C.column2
LEFT JOIN K on K.unique = A.unique
LEFT JOIN B AS D on D.column1 = K.column1 and C.column2 = D.column2
WHERE B.column2 = 'x'
)
这需要相当长的一段时间,但确实有效。我不满意,因为它似乎非常不优雅,但如果没有更好的解决方案,我会选择这一点(说实话,我真的不明白,为什么会有效)。
答案 0 :(得分:0)
如果我理解你的问题,这是一种可能的方法:
SELECT A.*, IF(B_X.column1 IS NOT NULL, B_X.column2, B_Y.column2), IF(B_X.column1 IS NOT NULL, B_X.column3, B_Y.column3), ...
FROM A
LEFT OUTER JOIN B B_X ON A.column1 = B_X.column1 AND B_X.column2 = 'x'
LEFT OUTER JOIN B B_Y ON A.column1 = B_Y.column1 AND B_Y.column2 = 'y'
你必须在SELECT子句的IF()中列出你想要的每一列,以便在'y'值之前得到'x'值。