none
איך אצרף 2 טבלאות ללא תנאי RRS feed

  • שאלה

  • יש לי טבלה אחת בעלת עמודה אחת המכילה מספרים כפי מספר עמודות בטבלה: 


    הטבלה השניה ממוינת ע"פ שלשה קריטריונים  :  וברצוני להצמיד את הטבלאות ללא תנאי (on,where). כלומר, העובד הראשון יהיה מספר אחד, השני -שתים וכו' בקיצור -

    איך משכתבים את הפונ' ROW_NUMBER??? (אני צריך את זה לאקסס...)


    • נערך על-ידי efraim kar יום חמישי 25 דצמבר 2014 09:19
    יום שני 22 דצמבר 2014 09:40

תשובות

  • אם אני מבין אותך נכון אז אתה רוצה לבצע פעולה דומה לשאילתה

    select [dbo].[Workers].tz,[dbo].[Workers].city_code, [dbo].[Workers].name,[dbo].[Workers].family,
    	ROW_NUMBER() OVER (order by tz,city_code)
    from Workers
    order by tz

    ז"א הבעיה שלך היא כיצד לממש order by לפי 2 טורים.

    אפשרות ראשונה הכי פשוטה היא שימוש בטבלה זמנית וטור IDENTITY כפי שנראה כאן:

    create table #TempTbl (	
    	[RowNum] [bigint] identity(1,1),
    	[tz] [bigint] NOT NULL,	
    	[name] [nvarchar](30) NULL,	
    	[family] [nvarchar](50) NULL,	
    	[year_born] [int] NULL,	
    	[city_code] [int] NULL
    )
    insert #TempTbl (tz,city_code, [year_born], name,family)
    select tz,city_code, [year_born], name,family from dbo.Workers order by tz,city_code
    SELECT * FROM #TempTbl
    DROP table #TempTbl

    אני לא עובד באקסס, אבל אם ממש רוצים שאילתה יותר "ישירה" אפשר בעקרון משהו כמו הפעולה הבאה אמור לעבוד (כל העניין הוא לבצע פעולה חשבונית פשוטה יחסית על השאילתות הפנימיות). אני רושם דוגמה מפורשת בצורה נוחה לקריאה אבל לא צריך לבצע שאילתה פנימית כדי למצוא ind1 ואת ind2, אלא אפשר חישוב ישיר. אני פשוט חושב שככה יהיה יותר קל להבין את הרעיון, בפורום.

    * זו שאילתה מאוד יעילה וכאמור ה "סתם" רעיון לעקוף מגבלה באקסס ולא בשרתי SQL

    select 
    	tz,city_code, name,family,
    	ind1,ind2,
    	ind1-ind2-1,
    	case when ind1=ind2 then ind1 else ind2+1 end as RowNum
    from (
    	select  
    		[dbo].[Workers].tz,[dbo].[Workers].city_code, [dbo].[Workers].name,[dbo].[Workers].family,
    		(select count(*) as i from dbo.workers b where  [dbo].[Workers].tz >= b.tz) ind1,
    		(select count(*) as i from dbo.workers b where  [dbo].[Workers].tz >= b.tz and [dbo].[Workers].city_code >= b.city_code) ind2
    	from  dbo.Workers
    )T
    order by tz

    * אני מניח שאין 2 נתונים זהים.

    ** אנא אל תשכח לסגור את השרשורים שפתחת (על ידי סימון התבה/ות שקיבלת בערת הקישורים מתחת להודעות, ואפשר גם להצביע על הודעות מועילות בעזרת הקישור משמאל להודעות)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    • נערך על-ידי pituachMVP, Editor יום חמישי 25 דצמבר 2014 09:33
    • סומן כתשובה על-ידי efraim kar יום חמישי 25 דצמבר 2014 11:25
    יום חמישי 25 דצמבר 2014 08:59
    מנחה דיון
  • יש עוד דרכים דרך אגב (בשרתי SQL אבל זה לא יעבוד באקסס אני חושב). למשל אפשר לעשות שימוש בפונקציה IDENTITY אם רוצים אבל היא חייבת להגיע עם יצירת טבלה חדשה בכל מקרה (יכול להחליף את החלק של יצירת הטבלה הזמנית תחילה ואז להכניס את הנתונים אליה בפעולה אחת). למשל:

    select *, IDENTITY(int, 1,1) as RowNum
    INTO #NewTable
    from dbo.Workers 
    order by tz,city_code
    
    select * from #NewTable
    DROP table #NewTable

    * אני מבטל את המחיקה של ההודעה שלך מעל. אני לא מבין מדוע מחקת אותה! הרעיון של הודעות בפורום זה ליצור דיון כדי שגם מי שנכנס אחרי זה יוכל לראות ולעקוב אחרי הדיון וללמוד ממנו. מה הרעיון למחוק הודעה אחרי שקיבלת תשובה?!? לא הבנתי :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    • נערך על-ידי pituachMVP, Editor יום חמישי 25 דצמבר 2014 10:07
    • סומן כתשובה על-ידי efraim kar יום חמישי 25 דצמבר 2014 11:24
    יום חמישי 25 דצמבר 2014 10:01
    מנחה דיון

כל התגובות

  • צהריים טבים,

    אם אני מבין נכון, אז השאלה שלך היא כיצד לממש פעולה דומה לפעולה של הפונקציה ROW_NUMBER בתוכנת אקסס. אם כך הדבר אז אתה יכול לעבוד פשוט עם שאילתה פנימית על מנת לקבוע את הערך של הטור. למשל משהו כזה:

    Select O.*, (select count(*) from YourTable I where O.ID>=I.ID) as Row_Number
    from Table1 as O
    order by A.ID
    אם השאלה שלך שונה, א אנא נסה להבהיר שוב, וצרף להודעה את ה DDL+DML שלך

    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    יום שני 22 דצמבר 2014 12:08
    מנחה דיון
  • כן, תודה. זה מה שעשיתי, הבעיה היא שעלי למיין לפי כמה עמודות ואז ה-ROW_NUMBER מתפזרת..


    select  [dbo].[Workers].city_code,  [dbo].[Workers].name,[dbo].[Workers].family,(select count(*) as i from dbo.workers b where  [dbo].[Workers].tz >=b.tz) ind
    from  dbo.Workers
    order by city_code, name,family
    • נערך על-ידי efraim kar יום שלישי 23 דצמבר 2014 06:06
    יום שלישי 23 דצמבר 2014 06:05
  • כמו שכתבתי מעל, אנא צרף לנו DDL+DML

    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    יום שלישי 23 דצמבר 2014 18:27
    מנחה דיון
  • קודם כל, תודה רבה! הסתבכתי עם זה למרות שאני בטוח שיש כאן פתרון יפה ולא כזה מבריק..

    CREATE TABLE [dbo].[Workers](	
    [tz] [bigint] NOT NULL,	
    [name] [varchar](30) NULL,	
    [family] [varchar](50) NULL,	
    [year_born] [int] NULL,	
    [city_code] [int] NULL)
    INSERT [dbo].[Workers] ([tz], [name], [family],  [city_code], ) 
    VALUES (100376391, N'רעות', N' סנדר', 1)
    INSERT [dbo].[Workers] ([tz], [name], [family], [city_code], )
     VALUES (104280265, N'רינה', N' ספיר', 1)
    INSERT [dbo].[Workers] ([tz], [name], [family],  [city_code],)
     VALUES (116690167, N'דגנית', N' פרויס', 5)
    INSERT [dbo].[Workers] ([tz], [name], [family],  [city_code],)
     VALUES (119211107, N'עידית', N' אולף ', 1)

    אני צריך טבלה שתהיה ממוינת לפי קוד עיר, שם, משפחה ובנוסף עמודה כמו אינקס ממוספרת מ-1 עד סוף הטבלה.

    הגבלות:

    -אין להשתמש בפונקציות כלל(ROW_NUMBER , RANK וכו..)

    -המיון של ארבעת השדות מוכרח, אחרת (מיון של עמודה אחת) הפתרון שהצעת מצוין.

    -הטבלה היא דינמית, הפעם מדובר בWORKERS מחר בטבלה אחרת.

    מקוה שהצלחתי להבהיר את העניין כמו שהוא.

    תודה,

    אפרים

    יום רביעי 24 דצמבר 2014 17:12
  • אם אני מבין אותך נכון אז אתה רוצה לבצע פעולה דומה לשאילתה

    select [dbo].[Workers].tz,[dbo].[Workers].city_code, [dbo].[Workers].name,[dbo].[Workers].family,
    	ROW_NUMBER() OVER (order by tz,city_code)
    from Workers
    order by tz

    ז"א הבעיה שלך היא כיצד לממש order by לפי 2 טורים.

    אפשרות ראשונה הכי פשוטה היא שימוש בטבלה זמנית וטור IDENTITY כפי שנראה כאן:

    create table #TempTbl (	
    	[RowNum] [bigint] identity(1,1),
    	[tz] [bigint] NOT NULL,	
    	[name] [nvarchar](30) NULL,	
    	[family] [nvarchar](50) NULL,	
    	[year_born] [int] NULL,	
    	[city_code] [int] NULL
    )
    insert #TempTbl (tz,city_code, [year_born], name,family)
    select tz,city_code, [year_born], name,family from dbo.Workers order by tz,city_code
    SELECT * FROM #TempTbl
    DROP table #TempTbl

    אני לא עובד באקסס, אבל אם ממש רוצים שאילתה יותר "ישירה" אפשר בעקרון משהו כמו הפעולה הבאה אמור לעבוד (כל העניין הוא לבצע פעולה חשבונית פשוטה יחסית על השאילתות הפנימיות). אני רושם דוגמה מפורשת בצורה נוחה לקריאה אבל לא צריך לבצע שאילתה פנימית כדי למצוא ind1 ואת ind2, אלא אפשר חישוב ישיר. אני פשוט חושב שככה יהיה יותר קל להבין את הרעיון, בפורום.

    * זו שאילתה מאוד יעילה וכאמור ה "סתם" רעיון לעקוף מגבלה באקסס ולא בשרתי SQL

    select 
    	tz,city_code, name,family,
    	ind1,ind2,
    	ind1-ind2-1,
    	case when ind1=ind2 then ind1 else ind2+1 end as RowNum
    from (
    	select  
    		[dbo].[Workers].tz,[dbo].[Workers].city_code, [dbo].[Workers].name,[dbo].[Workers].family,
    		(select count(*) as i from dbo.workers b where  [dbo].[Workers].tz >= b.tz) ind1,
    		(select count(*) as i from dbo.workers b where  [dbo].[Workers].tz >= b.tz and [dbo].[Workers].city_code >= b.city_code) ind2
    	from  dbo.Workers
    )T
    order by tz

    * אני מניח שאין 2 נתונים זהים.

    ** אנא אל תשכח לסגור את השרשורים שפתחת (על ידי סימון התבה/ות שקיבלת בערת הקישורים מתחת להודעות, ואפשר גם להצביע על הודעות מועילות בעזרת הקישור משמאל להודעות)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    • נערך על-ידי pituachMVP, Editor יום חמישי 25 דצמבר 2014 09:33
    • סומן כתשובה על-ידי efraim kar יום חמישי 25 דצמבר 2014 11:25
    יום חמישי 25 דצמבר 2014 08:59
    מנחה דיון
  • תודה! פשוט ונחמד..
    יום חמישי 25 דצמבר 2014 09:17
  • יש עוד דרכים דרך אגב (בשרתי SQL אבל זה לא יעבוד באקסס אני חושב). למשל אפשר לעשות שימוש בפונקציה IDENTITY אם רוצים אבל היא חייבת להגיע עם יצירת טבלה חדשה בכל מקרה (יכול להחליף את החלק של יצירת הטבלה הזמנית תחילה ואז להכניס את הנתונים אליה בפעולה אחת). למשל:

    select *, IDENTITY(int, 1,1) as RowNum
    INTO #NewTable
    from dbo.Workers 
    order by tz,city_code
    
    select * from #NewTable
    DROP table #NewTable

    * אני מבטל את המחיקה של ההודעה שלך מעל. אני לא מבין מדוע מחקת אותה! הרעיון של הודעות בפורום זה ליצור דיון כדי שגם מי שנכנס אחרי זה יוכל לראות ולעקוב אחרי הדיון וללמוד ממנו. מה הרעיון למחוק הודעה אחרי שקיבלת תשובה?!? לא הבנתי :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    • נערך על-ידי pituachMVP, Editor יום חמישי 25 דצמבר 2014 10:07
    • סומן כתשובה על-ידי efraim kar יום חמישי 25 דצמבר 2014 11:24
    יום חמישי 25 דצמבר 2014 10:01
    מנחה דיון
  • אנא סגור את השרשור אפרים

    את כל השרשורים שפתחת...

    תודה


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    יום חמישי 25 דצמבר 2014 10:03
    מנחה דיון
  • בהחלט מגיע לך..

    מחקתי כי לדעתי זה בלבל..

    אין בעיה שישאר כך

    תודה

    יום חמישי 25 דצמבר 2014 11:26