Reputation: 57
I have the following 4 tables:
**TABLE.INFO**
ID_INFO|INFO_LABLE|CODE_INFO|CATEGORY
2222001|XXXXCCCAA001|88888001|ITEM
2222002|XXXXCCCAA002|88888002|PICKUP
2222003|XXXXCCCAA003|88888002|ITEM
2222004|XXXXCCCAA004|88888001|PICKUP
2222005|XXXXCCCAA005|88888001|PICKUP
2222006|XXXXCCCAA006|88888003|SUPPLIER
**TABLE.ITEM**
ID_ITEM|ID_INFO|DETAIL_ITEM|EXPIRE_DATE
A00001|2222001|COOKIE|5/12/2017
A00002|2222003|PIE|24/11/2017
**TABLE.PICKUP**
ID_PICKUP|ID_INFO|DETAIL_PICKUP|EXPIRE_DATE
P00001|2222004|MOTOR|8/12/2017
P00002|2222005|CAR|26/11/2017
P00003|2222002|TRUCK|2/10/2017
**TABLE.SUPPLIER**
ID_SUPPLIER|ID_INFO|DETAIL_SUPPLIER|EXPIRE_DATE
S00001|2222006|BANANA GREEN|8/12/2017
I want to achieve the result which selects all field on TABLE.INFO with condition only having EXPIRE_DATE < '2017-11-31' and CODE_INFO in (88888002,88888001) from join other table. ie
ID_INFO|INFO_LABLE|CODE_INFO|CATEGORY
2222002|XXXXCCCAA002|88888002|PICKUP
2222003|XXXXCCCAA003|88888002|ITEM
2222005|XXXXCCCAA005|88888001|PICKUP
How can I achieve this using join table and where clause? I have done as follows but it is not working.
SELECT A.ID_INFO, A.INFO_LABLE, A.CODE-INFO, A.CATEGORY
FROM TABLE.INFO AS A
JOIN TABLE.ITEM AS B
ON A.ID_INFO = B.ID_INFO
JOIN TABLE.PICKUP AS C
ON A.ID_INFO = C.ID_INFO
JOIN TABLE.SUPPLIER AS D
ON A.ID_INFO = D.ID_INFO
WHERE A.CODE_INFO IN (88888002,88888001) AND B.DATE_EXPIRE < '2017-11-31' OR C.DATE_EXPIRE < '2017-11-31' OR D.DATE_EXPIRE < '2017-11-31';
if each table has a large record. for sequential processes joined to each table it will make the query process time is long. Are there any other suggestions, when TABLE.INFO will join to another table (TABLE.ITEM, TABLE.PICKUP, TABLE.SUPPLIER) is determined first based on the CATEGORY field in TABLE.INFO?
Upvotes: 1
Views: 246
Reputation: 147
You can use this query:
SELECT *
FROM ((SELECT info.*
FROM info
INNER JOIN (SELECT *
FROM item
WHERE expire_date < '2017-11-30') aa
ON info.id_info = aa.id_info)
UNION ALL
(SELECT info.*
FROM info
INNER JOIN (SELECT *
FROM pickup
WHERE expire_date < '2017-11-30') bb
ON info.id_info = bb.id_info)
UNION ALL
(SELECT info.*
FROM info
INNER JOIN (SELECT *
FROM supplier
WHERE expire_date < '2017-11-30') cc
ON info.id_info = cc.id_info))
WHERE code_info IN ( 88888002, 88888001 )
Upvotes: 0
Reputation: 3367
Try one of these methods.
Also, I have used '2017-12-01' instead of '2017-11-31'.
SELECT info.id_info,
info.info_lable,
info.code_info,
info.category
FROM info
LEFT JOIN item
ON item.id_info = info.id_info
AND item.expire_date < '2017-12-01'
LEFT JOIN pickup
ON pickup.id_info = info.id_info
AND pickup.expire_date < '2017-12-01'
LEFT JOIN supplier
ON supplier.id_info = info.id_info
AND supplier.expire_date < '2017-12-01'
WHERE info.code_info IN ( 88888001, 88888002 )
AND ( item.expire_date IS NOT NULL
OR pickup.expire_date IS NOT NULL
OR supplier.expire_date IS NOT NULL );
SELECT info.id_info, info.info_lable, info.code_info, info.category
FROM info
INNER JOIN item
ON item.id_info = info.id_info AND item.expire_date < '2017-12-01'
WHERE info.code_info IN ( 88888001, 88888002 )
UNION ALL
SELECT info.id_info, info.info_lable, info.code_info, info.category
FROM info
INNER JOIN pickup
ON pickup.id_info = info.id_info AND pickup.expire_date < '2017-12-01'
WHERE info.code_info IN ( 88888001, 88888002 )
UNION ALL
SELECT info.id_info, info.info_lable, info.code_info, info.category
FROM info
INNER JOIN supplier
ON supplier.id_info = info.id_info AND supplier.expire_date < '2017-12-01'
WHERE info.code_info IN ( 88888001, 88888002 );
Upvotes: 0
Reputation: 292
try it :
SELECT A.ID_INFO, A.INFO_LABLE, A.CODE-INFO, A.CATEGORY
FROM TABLE.INFO AS A
INNER JOIN TABLE.ITEM AS B
ON A.ID_INFO = B.ID_INFO AND B.DATE_EXPIRE < '2017-11-31'
WHERE A.CODE_INFO IN (88888002,88888001)
UNION ALL
SELECT A.ID_INFO, A.INFO_LABLE, A.CODE-INFO, A.CATEGORY
FROM TABLE.INFO AS A
INNER JOIN TABLE.PICKUP AS C
ON A.ID_INFO = C.ID_INFO AND C.DATE_EXPIRE < '2017-11-31'
WHERE A.CODE_INFO IN (88888002,88888001)
UNION ALL
SELECT A.ID_INFO, A.INFO_LABLE, A.CODE-INFO, A.CATEGORY
FROM TABLE.INFO AS A
INNER JOIN TABLE.SUPPLIER AS D
ON A.ID_INFO = D.ID_INFO AND D.DATE_EXPIRE < '2017-11-31'
WHERE A.CODE_INFO IN (88888002,88888001)
Upvotes: 1