有关此问题的操作,请参阅简单的http://sqlfiddle.com/#!9/e853f/1.
我指的是MySQL ver 5.6.12-log
据我了解,左连接为最右侧数据集中的列返回NULL,其中左侧数据集中的键不存在于右侧数据集中.
但是,即使左侧不存在左手键,我也会从右侧返回数据.
谁能解释一下这里发生了什么?
SQLfiddle创建:
(显然,视图中的3个ID对应于6行表中的一些ID.)
SQL SELECT*FROM LEFT JOIN ON table_ID = view_ID; 按预期返回6行,但所有这些行都在文本字段中有数据,而不是3个不匹配的数据为NULL
但
如果视图中用于派生文本列的方法稍有改动,那么Left Join SQL会给出正确的结果. (您可以通过选择性地在sql小提琴中注释掉两个方法中的一个或另一个来显示这个)
但是肯定不是优化器首先评估视图,所以数据的创建方式和它包含的内容无关紧要?
(我承认的早期问题的这个简化版本对于非法合理的答案来说太复杂了)
有人建议(Jeroen Mostert)我展示数据和预期结果.这里是:
表人
personID
--------
1
2
3
4
5
6
Run Code Online (Sandbox Code Playgroud)
查看payment_state
payment_personID | state
----------------------------
1 | 'equal'
2 | 'under'
3 | 'over'
Run Code Online (Sandbox Code Playgroud)
询问
SELECT * FROM person
LEFT JOIN payment_state
ON personID = payment_personID;
Run Code Online (Sandbox Code Playgroud)
预期结果
personID | payment_personID |state
-------------------------------------
1 | 1 | 'equal' …Run Code Online (Sandbox Code Playgroud) 我有一个显示数据库数据的表单,它有几个按钮和几个面板.这些面板包含各种组件,特别是TEdits,TComboBox,TDateTimePicker,TCheckBox,TListBox和TstringGrid.
当打开表单时,用户可以查看但不能编辑我当前禁用除使用按钮之外的所有组件的数据
for i := 0 to FrmAddNewMember.ComponentCount-1 do
if FrmAddNewMember.Components[i] is TPanel then
(FrmAddNewMember.Components[ i ] as TPanel).enabled := false;
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我现在希望用户能够将TEdits中的文本,TDateTimePicker中的日期,TComboBox中的所选项目等复制到剪贴板,但仍然不能更改它.
我将代码更改为以下内容,将TEdits设置为只读.这样做我想要的TEdits,但其他类型的控件没有只读属性,所以我像以前一样禁用它们.
for i := 0 to FrmAddNewMember.ComponentCount-1 do
if not (FrmAddNewMember.Components[i] is TButton) then //(keep buttons working)
case FrmAddNewMember.Components[i] of
TEdit: (FrmAddNewMember.Components[ i ] as TEdit).readonly := true; //allows copying but not editing
TComboBox: (FrmAddNewMember.Components[ i ] as TComboBox).enabled := false; //no read only propert?
TDateTimePicker: (FrmAddNewMember.Components[ i ] as TDateTimePicker).enabled := false; //ditto
TCheckBox: (FrmAddNewMember.Components[ i ] …Run Code Online (Sandbox Code Playgroud)