我有以下表格:
CREATE TABLE `app_ws_common` (
`serviceid` varchar(16) NOT NULL,
`applicationid` varchar(16) default NULL,
`modifieddate` date default NULL,
`version` decimal(1,0) default NULL,
`servicename` varchar(20) default NULL,
`userid` varchar(128) NOT NULL,
PRIMARY KEY (`serviceid`,`userid`),
KEY `table1_isv_fk` (`applicationid`,`userid`),
CONSTRAINT `table1_isv_fk` FOREIGN KEY (`applicationid`, `userid`) REFERENCES `applications` (`applicationid`, `userid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `app_ws_user` (
`serviceid` varchar(16) NOT NULL,
`userid` varchar(128) NOT NULL,
`applicationid` varchar(16) default NULL,
`modifieddate` date default NULL,
`version` decimal(1,0) default NULL,
`servicename` varchar(20) default NULL,
PRIMARY KEY (`serviceid`,`userid`),
KEY `FK_app_ws_user` (`applicationid`,`userid`),
CONSTRAINT `FK_app_ws_user` FOREIGN KEY (`applicationid`, `userid`) REFERENCES `applications` (`applicationid`, `userid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `applications` (
`applicationid` varchar(16) NOT NULL,
`userid` varchar(128) NOT NULL,
`applicationname` varchar(30) default NULL,
PRIMARY KEY (`applicationid`,`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `external_ws_common` (
`serviceid` varchar(16) NOT NULL,
`modifieddate` date default NULL,
`version` decimal(1,0) default NULL,
`servicename` varchar(20) default NULL,
PRIMARY KEY (`serviceid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `external_ws_user` (
`serviceid` varchar(16) NOT NULL,
`userid` varchar(128) NOT NULL,
`applicationid` varchar(16) default NULL,
`modifieddate` date default NULL,
`version` decimal(1,0) default NULL,
`servicename` varchar(20) default NULL,
PRIMARY KEY (`serviceid`,`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
下面:
app_ws_common 表包含所有用户共有的所有应用相关服务
app_ws_user 表包含特定用户创建的所有与应用程序相关的服务,并从其通用版本进行编辑。
应用程序表将包含应用程序列表和相应的用户。
external_ws_common 表将包含独立于所有应用程序且对所有用户通用的服务列表。
external_ws_user 表将包含与任何应用程序不对应并由用户从“常见”版本的外部服务创建或编辑的服务列表。
现在,我必须从表app_ws_user中检索所有与应用程序相关的服务,并在app_ws_user表中没有该特定用户的编辑版本时从表app_ws_common中检索所有服务。
如何有效地为此编写查询? 或者我应该重新设计这张桌子?
答案 0 :(得分:0)
希望这会有所帮助:::
SELECT
service_id, service_name
FROM app_ws_common awc
left join app_ws_user awu on (awc.serviceid=awu.serviceid and awc.applicationid=awu.applicationid)
UNION
SELECT service_id, service_name
FROM app_ws_common awc
right join app_ws_user awu on (awc.serviceid=awu.serviceid and awc.applicationid=awu.applicationid)