现在我正在“学习”Postgres SQL。我有3张桌子:
1)用户:userId
2)Stack:stackId
3)User_Stack:userId,stackId
现在我想获取属于一个用户的所有堆栈,给定userId。我知道我需要使用Joins,但那就是我被卡住了...我试试这样:
SELECT * FROM "Stack" LEFT OUTER JOIN "User_Stack" ON ('User_Stack.stackId' = 'Stack.stackId') WHERE "userId" = '590855';
错误:返回的数据为空。
PS:那里有GUI查询构建器吗?或者您有任何其他提示如何系统地创建查询?
编辑:如果我将查询更改为:
SELECT * FROM "Stack" INNER JOIN "User_Stack" ON (User_Stack.stackId = Stack.stackId) WHERE "userId" = '590855';
我收到以下错误:
Kernel error: ERROR: missing FROM-clause entry for table "user_stack"
LINE 1: SELECT * FROM "Stack" INNER JOIN "User_Stack" ON (User_Stack...
答案 0 :(得分:1)
您的主要错误是在加入中。如果您执行'something' = 'other'
,则需要比较字符串文字,而不是从数据库中获取任何内容。所以这总是会返回false。您需要比较table1.field1 = table2.field2
另一件事是LEFT OUTER JOIN
。我很确定你想要一个INNER JOIN
,因为你只想要在另一个表中存在的字段。
此外,不要对字段和表名使用双引号,因为数据库将需要区分大小写,并且通常使用区分大小写的名称并不好。如果需要,可以使用小写名称,并始终以小写形式创建它们。
数字也不需要引用,当系统必须将它们从文本转换为数字时,它只会导致更多的处理。