SQL操作数应包含1列

时间:2014-11-19 14:09:10

标签: mysql sql select join

我认为这应该很简单,但我似乎无法弄清楚。

我有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.

如果您需要更多解释,我会解释更多

4 个答案:

答案 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 idcomplete = 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