SQL Join -Always从第一个表中为第二个表中的每一行返回数据

时间:2012-04-09 17:36:17

标签: sql join

我有两个表tblSettingsLookup和tblFirm。 我在查找表中有5个设置,主要用于动态地重新设置设置名称。例如。如果有5个设置,那么每个公司可以在某个页面上看到五个设置。如果我添加一个新设置,现在所有公司都会看到6个设置。

我有一个页面可以从tblSettingsLookup获取所有设置,用户可以通过复选框从我的应用程序中的网页中选择这些设置并将其保存在数据库中。 这些用户设置保存在另一个表格tblusersettingsforfirms

tblusersettingsforfirm有settingIDFK,firmIDFK和其他一些列 tblSettingsLookup有settingID,设置名称 tblFirm有FirmID

我真正需要做的是,我想要一个查询从tblSettingsLookup返回所有记录,并根据firmID返回公司的所有用户设置。

我尝试过左外连接但没有希望。我不需要交叉连接

结果应该如下:

firmid settingname      
1      add user
1      delete user
1      save user
2      add user
2      save user
2      delete user 

3 个答案:

答案 0 :(得分:1)

你想要的是交叉连接和左连接:

select f.FirmID, l.settingname, u.settingIDFK
from
  tblFirm as f
  cross join tblSettingsLookup as l
  left join tblusersettingsforfirms u
    on u.settingIDFK = l.settingID and u.firmIDFK = f.FirmID

如果没有用户设置,则u.settingIDFK返回的值将为null。您可能希望从该表中返回其他值。

示例结果:

firmID  settingname  settingIDFK
1       add user     42
1       delete user  null
1       save user    76
2       add user     14
2       save user    null
2       delete user  null

要过滤掉特定公司的数据,只需添加where子句即可。例如:

select f.FirmID, l.settingname, u.settingIDFK
from
  tblFirm as f
  cross join tblSettingsLookup as l
  left join tblusersettingsforfirms u
    on u.settingIDFK = l.settingID and u.firmIDFK = f.FirmID
where f.firmID = 15

答案 1 :(得分:0)

你在找这样的东西吗?

    SELECT `tblFirm`.`firmid`, `tblusersettingsforfirm`.`settingname`  
    FROM `tblFirm`, `tblusersettingsforfirm`
    WHERE (`tblFirm`.`firmid` =  
    `tblusersettingsforfirm`.`firmIDFK`)

答案 2 :(得分:0)

虽然你的描述不是那么清楚(这有助于显示你希望与预期输出一起加入的两个表中的数据),但它听起来对我来说就像你想要简单地显示一样每个公司的每个设置记录的一个实例。也就是说,实际上是交叉连接(或笛卡尔积):

 SELECT tblFirm.FirmID, tblSettingsLookup.setting_name
   FROM tblFirm, tblSettingsLookup