2013-04-23 54 views
2

美好的一天。如何提出有效请求?

查询数据库中选择表中不同行:

SELECT 
DISTINCT 
f.id_service as f_id_service, 
f.id_city as f_id_city, 
f.name as f_name, 
f.address as f_address, 
f.business as f_business, 
f.web as f_web, 
f.phone as f_phone, 
f.id_firm as f_id_firm, 
p.name as p_name 
FROM Firm f left join Price p on p.id_service=f.id_service AND p.id_city=f.id_city AND p.id_firm=f.id_firm 

导航我使用NOT IN:

SELECT 
DISTINCT TOP 20 
f.id_service as f_id_service, 
f.id_city as f_id_city, 
f.name as f_name, 
f.address as f_address, 
f.business as f_business, 
f.web as f_web, 
f.phone as f_phone, 
f.id_firm as f_id_firm, 
p.name as p_name 
FROM Firm f left join Price p on p.id_service=f.id_service AND p.id_city=f.id_city AND p.id_firm=f.id_firm 

WHERE 

f.name 
NOT IN (
SELECT DISTINCT TOP 20 
f.name FROM Firm f 
left join Price p on p.id_service=f.id_service AND p.id_city=f.id_city AND p.id_firm=f.id_firm 
WHERE p.id_city='73041' AND p.include='1' AND p.blocked='0' AND f.blocked='0' AND p.id_group='44' AND p.id_subgroup='266' 
ORDER BY f.name ASC 
) 
AND p.id_firm=f.id_firm AND p.id_city='73041' AND p.include='1' AND p.blocked='0' 
AND f.blocked='0' AND p.id_group='44' AND p.id_subgroup='266' 
ORDER BY f.name ASC 

在上查询被检查f.name NOT IN但我需要检查整个字符串作为第一个查询,不仅有f.name

怎么做到的?

+0

f.id_firm不是在(SELECT DISTINCT TOP 20 f.id_firm从公司F)? – bummi 2013-04-23 09:45:28

+0

查看NOT EXISTS(SELECT * FROM FIRM ...... WHERE等) – 2013-04-23 13:28:26

回答

2
SELECT f.name as f_name, 
max(f.address) as f_address, 
max(f.business) as f_business, 
max(f.web) as f_web, 
max(f.phone) as f_phone, 
max(p.name) as p_name 
FROM Firm f 
left join Price p on p.id_service=f.id_service 
AND p.id_city=f.id_city AND p.id_firm=f.id_firm 

WHERE 

f.name NOT IN (
SELECT TOP $numnext 
f.name 
FROM Firm f 
left join Price p on p.id_service=f.id_service AND p.id_city=f.id_city 
AND p.id_firm=f.id_firm 
WHERE 
p.id_firm=f.id_firm AND p.id_city='73041' AND p.include='1' AND p.blocked='0' 
AND f.blocked='0' AND p.id_group='44' AND p.id_subgroup='266' 
GROUP BY f.name 
ORDER BY f.name ASC 
) 

AND 
p.id_firm=f.id_firm AND p.id_city='73041' AND p.include='1' AND p.blocked='0' 
AND f.blocked='0' AND p.id_group='44' AND p.id_subgroup='266' 
GROUP BY f.name 
ORDER BY f.name ASC 
2

这可能是有益的你 -

;WITH cte AS 
(
    SELECT DISTINCT 
      f_id_service = f.id_service 
     , f_id_city = f.id_city 
     , f_name = f.name 
     , f_address = f.[address] 
     , f_business = f.business 
     , f_web = f.web 
     , f_phone = f.phone 
     , f_id_firm = f.id_firm 
     , p_name = p.name 
    FROM Firm f 
    LEFT JOIN Price p ON p.id_service = f.id_service AND p.id_city = f.id_city AND p.id_firm = f.id_firm 
    WHERE p.id_city = '73041' 
     AND p.[include] = '1' 
     AND p.blocked = '0' 
     AND f.blocked = '0' 
     AND p.id_group = '44' 
     AND p.id_subgroup = '266' 
) 
SELECT TOP 20 
     f_id_service 
    , f_id_city 
    , f_name 
    , f_address 
    , f_business 
    , f_web 
    , f_phone 
    , f_id_firm 
    , p_name 
FROM cte 
WHERE f_name NOT IN (
     SELECT DISTINCT TOP 20 f_name 
     FROM cte 
     ORDER BY f_name 
    ) 
ORDER BY f_name 
+0

'消息207,级别16,状态1,行24 无效的列名称'f_id_service'。 消息207,级别16,状态1,行25 无效的列名称'f_id_city'.' – Strannik 2013-04-23 14:39:28

+0

请尝试更新的答案。 – Devart 2013-04-24 05:06:11