我试图通过我的computer_system检索组件列表,但是如果计算机系统的图形卡设置为null(即它有一个板载),则该行不会被返回通过我的选择声明。
我一直试图使用COALESCE而没有结果。我还在我的WHERE子句中尝试使用OR,然后只返回我的计算机系统和各种图形卡。
相关代码:
SELECT
computer_system.cs_id,
computer_system.cs_name,
motherboard.name,
motherboard.price,
cpu.name,
cpu.price,
gfx.name,
gfx.price
FROM
public.computer_case ,
public.computer_system,
public.cpu,
public.gfx,
public.motherboard,
public.ram
WHERE
computer_system.cs_ram = ram.ram_id AND
computer_system.cs_cpu = cpu.cpu_id AND
computer_system.cs_mb = motherboard.mb_id AND
computer_system.cs_case = computer_case.case_id AND
computer_system.cs_gfx = gfx.gfx_id; <-- ( OR computer_system.cs_gfx IS NULL)
返回:
1;"Computer1";"Fractal Design"; 721.00; "MSI Z87"; 982.00; "Core i7 I7-4770K "; 2147.00; "Crucial Gamer"; 1253.00; "ASUS GTX780";3328.00
我应该使用联接吗?有没有简单的方法来表示返回请求的行,即使有一个血腥的NULL值。一直在努力奋斗至少2个小时。
如果需要,将发布表格。
编辑:它应该返回第二行:
2;"Computer2";"Fractal Design"; 721.00; "MSI Z87"; 982.00; "Core i7 I7-4770K "; 2147.00; "Crucial Gamer"; 1253.00; "null/nothing";null/nothing
答案 0 :(得分:2)
您需要LEFT OUTER JOIN
。
首先,清理代码,以便使用ANSI连接,以便它可读:
SELECT
computer_system.cs_id,
computer_system.cs_name,
motherboard.name,
motherboard.price,
cpu.name,
cpu.price,
gfx.name,
gfx.price
FROM
public.computer_system
INNER JOIN public.computer_case ON computer_system.cs_case = computer_case.case_id
INNER JOIN public.cpu ON computer_system.cs_cpu = cpu.cpu_id
INNER JOIN public.gfx ON computer_system.cs_gfx = gfx.gfx_id
INNER JOIN public.motherboard ON computer_system.cs_mb = motherboard.mb_id
INNER JOIN public.ram ON computer_system.cs_ram = ram.ram_id;
然后将INNER JOIN
上的public.gfx
更改为LEFT OUTER JOIN
:
LEFT OUTER JOIN public.gfx ON computer_system.cs_gfx = gfx.gfx_id
请参阅PostgreSQL tutorial - joins。
我强烈建议您阅读SQL的入门教程 - 至少是PostgreSQL教程,最好还有一些更多的材料。
答案 1 :(得分:1)
看起来它只是一个支架放置问题。将空检查和图形卡ID比较单独拉入一个子句。
...
computer_system.cs_case = computer_case.case_id AND
(computer_system.cs_gfx IS NULL OR computer_system.cs_gfx = gfx.gfx_id)
此外,您询问是否应该使用连接。事实上,您通过在FROM子句中使用多个表并在WHERE子句中指定连接条件来使用连接。更改此选项以使用JOIN ON语法可能更容易阅读:
FROM sometable A
JOIN someothertable B
ON A.somefield = B.somefield
JOIN somethirdtable C
ON A.somefield = C.somefield
etc
编辑:
您可能还希望将您希望null值的连接设置为左外连接:
SELECT * FROM
first_table a
LEFT OUTER JOIN second_table b
ON a.someValue = b.someValue
如果连接中没有匹配项,则仍将返回左侧的行。