को सरल बनाने में एक प्रश्न के साथ एक नेस्टेड क्वेरी

0

सवाल

मैं करना चाहते हैं की जरूरत को दूर करने के लिए एक नेस्टेड क्वेरी कर सकते हैं अगर मैं से मेरे प्रश्न के नीचे है, लेकिन मैं संघर्ष कर रहा हूँ बाहर काम करने के लिए कैसे.

इस स्कीमा:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE IF NOT EXISTS [dbo].[expiration]
(
    [batch_number] [int] NOT NULL,
    [fruit_number] [int] NOT NULL,
    [store_number] [int] NOT NULL,
    [expiration_date] [date] NULL
) ON [PRIMARY]

CREATE TABLE IF NOT EXISTS [dbo].[fruits]
(
    [fruit_number] [int] NOT NULL,
    [fruit_name] [nvarchar](50) NOT NULL
) ON [PRIMARY]

इस डेटा है:

INSERT IGNORE INTO [dbo].[expiration] ([batch_number], [fruit_number], [store_number], [expiration_date]) 
VALUES (1, 3, 4, CAST(N'2021-11-25' AS Date))

INSERT IGNORE INTO [dbo].[expiration] ([batch_number], [fruit_number], [store_number], [expiration_date]) 
VALUES (1, 2, 2, CAST(N'2021-11-22' AS Date))

INSERT IGNORE INTO [dbo].[expiration] ([batch_number], [fruit_number], [store_number], [expiration_date]) 
VALUES (1, 5, 3, CAST(N'2021-11-30' AS Date))

INSERT IGNORE INTO [dbo].[expiration] ([batch_number], [fruit_number], [store_number], [expiration_date]) 
VALUES (2, 2, 7, NULL)

INSERT IGNORE INTO [dbo].[expiration] ([batch_number], [fruit_number], [store_number], [expiration_date]) 
VALUES (2, 3, 2, CAST(N'2021-12-12' AS Date))

INSERT IGNORE INTO [dbo].[expiration] ([batch_number], [fruit_number], [store_number], [expiration_date]) 
VALUES (1, 1, 5, NULL)

INSERT IGNORE INTO [dbo].[expiration] ([batch_number], [fruit_number], [store_number], [expiration_date]) 
VALUES (2, 1, 6, CAST(N'2021-11-28' AS Date))

INSERT IGNORE INTO [dbo].[fruits] ([fruit_number], [fruit_name]) 
VALUES (1, N'banana')

INSERT IGNORE INTO [dbo].[fruits] ([fruit_number], [fruit_name]) 
VALUES (2, N'apple')

INSERT IGNORE INTO [dbo].[fruits] ([fruit_number], [fruit_name]) 
VALUES (3, N'pear')

INSERT IGNORE INTO [dbo].[fruits] ([fruit_number], [fruit_name]) 
VALUES (4, N'peach')

INSERT IGNORE INTO [dbo].[fruits] ([fruit_number], [fruit_name]) 
VALUES (5, N'strawberry')

और यह मेरी क्वेरी:

SELECT
    fruit_number, 
    MAX(expirationDate) as expirationDate
FROM
    (SELECT
        f.fruit_number,
        CASE
            WHEN e.expiration_date is NULL AND e.fruit_number IS NOT NULL THEN 1
            ELSE 0
        END AS expirationDate
    FROM
        expiration AS e
    FULL OUTER JOIN 
        fruits AS f ON f.fruit_number = e.fruit_number
    WHERE
        f.fruit_number IS NOT NULL) t
GROUP BY
    fruit_number
ORDER BY
    fruit_number

यह उत्पादन, इस परिणाम सेट:

fruit_number expirationDate
1 1
2 1
3 0
4 0
5 0

Resultset है मैं क्या कर रहा हूँ के बाद, लेकिन यह बदसूरत होने नेस्टेड क्वेरी । क्या यह संभव है बिना ऐसा करने के लिए नेस्टेड क्वेरी? एक ऑनलाइन क्वेरी विश्लेषक (https://www.eversql.com/sql-query-optimizer/) ने कहा कि स्थानांतरित करने के लिए उप-क्वेरी में एक अस्थायी तालिका और क्वेरी के खिलाफ है कि है, लेकिन नहीं है सिर्फ एक ही बात कर में और अधिक कदम?

sql-server tsql
2021-11-23 12:03:11
3

सबसे अच्छा जवाब

2

पहले मैं परिवर्तन बनाने के लिए होता है के साथ अपने मिलती है. यह नहीं समझ में आता है का उपयोग करने के लिए एक FULL OUTER JOIN फिर में डाल दिया, जहां एक खंड है कि कहते हैं f.fruit_number IS NOT NULL. इसका मतलब यह है कि हर पंक्ति होना चाहिए में एक रिकॉर्ड fruits, तो आपकी क्वेरी से होगा और अधिक समझ बनाने के रूप में SELECT .. FROM fruits AS f LEFT JOIN expiration AS e ON e.fruit_number = f.fruit_number.

आप भी निकाल सकते हैं सबक्वेरी रखने के द्वारा अपने मामले अभिव्यक्ति के भीतर सीधे MAX समारोह:

SELECT  f.fruit_number, 
        f.fruit_name,
        expirationDate = MAX(CASE WHEN e.expiration_date IS NULL 
                                    AND e.fruit_number IS NOT NULL THEN 1 ELSE 0 END)
FROM    dbo.fruits AS f
        LEFT JOIN dbo.expiration AS e
            ON e.fruit_number = f.fruit_number
GROUP BY f.fruit_number, f.fruit_name
ORDER BY f.fruit_number;

उदाहरण db<>बेला

2021-11-23 12:35:52
0

यह एक कोशिश दे दो, मुझे विश्वास है कि यह हो जाता है तुम क्या आप चाहते थे:

SELECT t1.fruit_number
, CASE WHEN MIN(ISNULL(expiration_date, '1/1/1900')) = CAST('1/1/1900' as date) and t2.fruit_number IS NOT NULL THEN 1 ELSE 0 END expirationDate
FROM fruits t1 
LEFT JOIN expiration t2 on t1.fruit_number = t2.fruit_number
GROUP BY t1.fruit_number, t2.fruit_number
ORDER BY t1.fruit_number
2021-11-23 12:24:55
0

यह लगता है आप कर रहे हैं overcomplicating । यह मानते हुए कि fruit_number में अद्वितीय है fruits, वहाँ की कोई जरूरत नहीं है के लिए एक group by, बजाय एक का उपयोग करें exists

SELECT
  f.fruit_number, 
  f.fruit_name,
  expirationDate = CASE WHEN EXISTS (SELECT 1
                       FROM dbo.expiration AS e
                       WHERE e.fruit_number = f.fruit_number
                         AND e.expiration_date IS NULL
                     ) THEN 1 ELSE 0 END
FROM dbo.fruits AS f
ORDER BY f.fruit_number;

db<>बेला

2021-11-23 16:39:29

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में