我认为这应该很简单,但我似乎无法弄清楚。
我有2张桌子。表A和表B由一个具有相同值的字段连接。
我想从表A中选择所有行。从表B中,我想选择所有连接到表A的表,其中表A中的列是特定值。
这就是我看待它的工作原理
SELECT tableA.*, (SELECT * FROM tableB INNER JOIN tableA on tableB.id = tableA.id WHERE tableA.complete = 1) FROM tableA
我已运行此代码,但我收到此错误
操作数应包含1列
如何从表A获取所有值并连接表B中表A列为1的行?
修改
这是我期望的输出
Table_A.someID Table_A.col Table_A.complete Table_B.someID Table_B.col
----------------|----------------|---------------------|-------------------|----------------
123 | something | 1 | 123 | value
124 | something | 1 | 124 | value
125 | something | 1 | 125 | value
126 | something | 0 | |
127 | something | 0 | |
我希望表A中的所有行都与列完整值无关,而表B中任何链接到表A并且完成的行都是1.
如果您需要更多解释,我会解释更多
答案 0 :(得分:2)
你不需要外部查询。这应该足够了
SELECT tableA.*
FROM tableB INNER JOIN tableA on tableB.id = tableA.id
WHERE tableA.complete = 1
答案 1 :(得分:1)
你的语法错误。它实际上比你想做的更简单。
以下内容应该有效
SELECT a.*
FROM tableA AS a
INNER JOIN tableB AS b
ON tableB.id = tableA.id
WHERE a.complete = 1
或者,如果您要查找tableB中的值,则可以执行以下操作:
SELECT a.*, b.*
FROM tableA AS a
INNER JOIN tableB AS b
ON tableB.id = tableA.id
WHERE a.complete = 1
虽然tableA和tableB都有id列这一事实可能会抛出错误,具体取决于。我实际上建议你避免使用。*和b。*而是明确列出你需要的列,例如SELECT a.id, b.whatever, a.somethingelse FROM tableA AS a...
特别是对于不从您的表中选择*,这值得一读:Why is SELECT * considered harmful?
根据您的最终修改,这就是您想要的:
SELECT a.someID, a.col, a. complete, b.someID, b.col
FROM tableA AS a
LEFT JOIN tableB AS b
ON tableB.id = tableA.id
WHERE a.complete = 1
你可以做一个。,b。,但我不建议这样做。另请注意左连接。这很重要。
答案 2 :(得分:0)
left outer join
可以完成您的工作:
SELECT *
FROM tableA a
LEFT OUTER JOIN tableB b
ON a.id = b.id
AND a.complete = 1
它将返回tableA
的所有行,tableB
的行将根据tableA
id
与complete = 1
匹配。如果不匹配则会显示NULL
。
答案 3 :(得分:0)
编辑:问题中的更多细节
SELECT *
FROM TableA
LEFT OUTER JOIN TableB ON TableA.id = TableB.ID AND TableA.complete = 1
将为您提供TableA的所有行,以及TableB中匹配的数据,其中complete为1,否则为NULL