[英]Is a left outer join needed when I only need one column from the joined (right) table in the WHERE clause?
[英]How can I make a WHERE clause only apply to the right table in a left join?
我有兩張桌子。
TableA: field_definitions
field_id, field_type, field_length, field_name, field_desc, display_order, field_section, active
TableB: user_data
response_id, user_id, field_id, user_response
我需要一個將返回表A中所有行的查詢,如果它們存在,則根據特定的user_id匹配表B中的行。
這是我到目前為止所擁有的......
SELECT field_definitions. * , user_data.user_response
FROM field_definitions
LEFT JOIN user_data
USING ( field_id )
WHERE (
user_data.user_id =8
OR user_data.user_id IS NULL
)
AND field_definitions.field_section =1
AND field_definitions.active =1
ORDER BY display_order ASC
僅當表B在WHERE子句中具有零行或匹配的user_id行時,此方法才有效。 如果表B具有匹配的field_id而不是user_id的行,則返回零行。
實質上,一旦表B中的行存在於用戶X,查詢在搜索用戶Z響應時不再返回表A中的行,並且找不到任何行。
我需要結果始終包含表A中的行,即使B中沒有匹配的行與正確的user_id。
您可以將這些約束從WHERE
子句移動到ON
子句(首先要求您將USING
子句更改為ON
子句: ON
子句比USING
子句更靈活)。 所以:
SELECT field_definitions.*,
user_data.user_response
FROM field_definitions
LEFT
JOIN user_data
ON user_data.field_id = field_definitions.field_id
AND user_data.user_id = 8
WHERE field_definitions.field_section = 1
AND field_definitions.active = 1
ORDER
BY field_definitions.display_order ASC
;
從概念上講,首先執行連接,然后將where子句應用於虛擬結果集。 如果要首先過濾一個表,則必須將其編碼為連接內的子選擇。 這些方面的東西:
SELECT
field_definitions. * ,
user8.user_response
FROM
field_definitions
LEFT JOIN (select * from user_data where user_id=8 or user_id is null) as user8
USING ( field_id )
WHERE
field_definitions.field_section =1
AND field_definitions.active =1
ORDER BY display_order ASC
您可以按如下方式移動WHERE子句
SELECT field_definitions. * , user_data.user_response
FROM (
select * from
field_definitions
WHERE field_definitions.field_section =1
AND field_definitions.active =1 ) as field_definitions
LEFT JOIN (
select * from
user_data
where user_data.user_id =8
OR user_data.user_id IS NULL ) as user_data
USING ( field_id )
ORDER BY display_order ASC
sepc的字面翻譯:
SELECT field_definitions. * , '{{MISSING}}' AS user_response
FROM field_definitions
UNION
SELECT field_definitions. * , user_data.user_response
FROM field_definitions
NATURAL JOIN user_data
WHERE user_data.user_id = 8;
但是,我懷疑你並不真的想要“表A中的所有行”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.