'SQL simplify the query or request an efficient way (i am new to SQL)
Is it possible to simplify the below query by reducing the table name repetition ? However, Its working for now, but I am not sure, whether it is an efficient way of writing the query or not. I would like to minimize the table names in the below query.
[![Output][1]][1]
Table Structure:
CREATE TABLE [dbo].[TestTable](
[attr_id] [int] IDENTITY(1,1) NOT NULL,
[attr_filter] [varchar](50) NULL,
[attr_value] [varchar](100) NULL,
[attr_key] [varchar](50) NULL
)
GO
**Values to Insert:**
Insert Into TestTable ([attr_id],[attr_filter],[attr_value],[attr_key])
Values (1,N'card_line_item_status',N'Assigned',N'card_line_item_status')
,(2,N'card_line_item_status',N'Hold',N'card_line_item_status')
,(3,N'card_line_item_status',N'In Progress',N'card_line_item_status')
,(4,N'card_line_item_status',N'Complete',N'card_line_item_status')
,(5,N'card_violation_types',N'Inactive Employee',N'card_violation_types')
,(6,N'card_violation_types',N'Location Mismatch',N'card_violation_types')
,(7,N'card_violation_types',N'Duplicate Card',N'card_violation_types')
,(8,N'card_violation_types',N'Cardholder Mismatch',N'card_violation_types')
,(9,N'payment_status',N'Cheque payment',N'Personal_Process')
,(10,N'payment_status',N'Payment to Adobe',N'Personal_Process')
,(11,N'payment_status',N'Electronic Payment (Personal)',N'Personal_Process')
,(12,N'action_taken',N'1st reminder set',N'Fraud_Process')
,(13,N'action_taken',N'2nd reminder set',N'Fraud_Process')
,(14,N'action_taken',N'JE needed',N'Fraud_Process')
,(15,N'action_taken',N'Dispute raised with bank/vendor',N'Fraud_Process')
,(16,N'action_taken',N'Credit submitted',N'Fraud_Process')
,(17,N'action_taken',N'Others',N'Fraud_Process')
,(18,N'status',N'Assigned',N'Personal_Process')
,(19,N'status',N'In Progress',N'Personal_Process')
,(20,N'status',N'Complete',N'Personal_Process')
,(21,NULL,N'Complete',N'adobe_sign_status')
,(22,NULL,N'Waiting for manager',N'adobe_sign_status')
,(23,NULL,N'Waiting for employee',N'adobe_sign_status')
,(24,NULL,N'Cancelled',N'adobe_sign_status')
,(25,N'status',N'Email Sent',N'Personal_Process')
,(26,N'status',N'Email Received',N'Personal_Process')
,(27,N'payment_status',N'Charge Off',N'Personal_Process')
Output should be like a javascript object like below, in the browser response:
{
card_line_item_status: {},
card_violation_types: {}
}
SELECT
(
SELECT
[attr_value]
FROM dbo.Static_Attributes AS ac
WHERE attr_filter = 'card_line_item_status' FOR JSON PATH
) AS [card_line_item_status],
(
SELECT
attr_value
FROM dbo.Static_Attributes AS ac
WHERE attr_filter = 'card_violation_types' FOR JSON PATH
) AS [card_violation_types],
(
SELECT
attr_value
FROM dbo.Static_Attributes AS ac
WHERE attr_key = 'Personal_Process' and attr_filter = 'payment_status' FOR JSON PATH
) AS [payment_status_list],
ISNULL((SELECT
role_name
FROM assign_user_roles aur
JOIN roles_list rl
ON aur.role_id = rl.role_id
WHERE aur.[user_id] = @userId FOR JSON PATH), '[{"role_name": "OTHERS"}]')
AS [roles],
(
SELECT
attr_value
FROM dbo.Static_Attributes AS ac
WHERE attr_key = 'Fraud_Process' and attr_filter = 'action_taken' FOR JSON PATH
) AS [action_taken_list],
(
SELECT
attr_value
FROM dbo.Static_Attributes AS ac
WHERE attr_key = 'Personal_Process' and attr_filter = 'status' FOR JSON PATH
) AS [personal_fraud_status],
(
SELECT
attr_value
FROM dbo.Static_Attributes AS ac
WHERE attr_key = 'adobe_sign_status' FOR JSON PATH
) AS [adobe_sign_status_list]```
[1]: https://i.stack.imgur.com/ltyhK.png
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
