2015-11-19 37 views
0

我在这里看到了几个与此非常相似的问题,但是我还没有找到具体到我相信我的问题的答案。当字段= 0时MySQL返回所有行

我有两个表,subcompaniespresets。这两张表通过ID CntRefIDPresetIDFoxPro连接在一起。我想在ID匹配时从Preset表格的文本列中选择所有文本。

CntRefID中有一个数字时,此功能完美无瑕。但是,如果它是0,则会返回presets文本列中的每个字段。

这是我的查询文本;

myQuery.CommandText = 
"SELECT CompanyID, CompanyName, PresetText, InvHeader, Prefix, NextBnum 
FROM sdcdatabase.sdcsubcompanies, sdcdatabase.presets 
WHERE (CntRef=PresetIDFoxPro OR CntRef='0') AND PresetReferenceFoxPro=3"; 

我不明白为什么每个字段都被选中。我已经在引号中试过0,没有引号,我也看到它可能是由于一个字段是一个整数而一个字符是Char(mySQL returns all rows when field=0)。但是我的字段都是整数。

+0

为什么您的查询包含'OR CntRef ='0''条件?是因为你知道没有与该ID相匹配的“预设”记录,并且即使它们在“预设”上没有匹配,你也想返回“子公司”记录吗? –

回答

1

所有从presets表行由于OR CntRef='0'条件返回(其中CntRef是0)。

这是因为现有的where子句可以被改写(忽略PresetReferenceFoxPro条件)为:

我想从subcompanies表,无论是从presets表中的任何匹配的记录,或者从所有记录中的所有记录presets表,其中CntRefsubcompanies表中为0。

如果你想返回subcompanies记录,即使他们没有在预设的匹配,那么你需要使用LEFT OUTER JOIN - 像这样:

SELECT CompanyID, CompanyName, PresetText, InvHeader, Prefix, NextBnum 
FROM sdcdatabase.sdcsubcompanies as s 
LEFT OUTER JOIN sdcdatabase.presets as p 
ON s.CntRef=p.PresetIDFoxPro AND p.PresetReferenceFoxPro=3 

我假设PresetReferenceFoxPro是在presets表 - 它会澄清查询将表别名添加到SELECT子句中的每个列,但我不知道哪些列来自哪些表。

+0

工作良好的感谢,只是为了添加,如果我有第三个表,我不想参与连接,它将适合在哪里? – CBreeze

+0

@CBreeze - 这取决于你想用它做什么 - 我建议开一个新的问题,并在哪些表中包含哪些字段的相关细节。 –

0

你需要你“其中”通过消除改变“或”或添加更多条件

WHERE (CntRef=PresetIDFoxPro) .... other conditions 

刚例如

+0

是不是'AND PresetIDFoxPro <> 0'多余 - 如果PresetIDFoxPro等于零,那么表达式的左边是真实的,使整个表达式为真。 – PaulF

+0

不好的例子 - 我会编辑 – genespos